- 浏览: 295430 次
- 性别:
- 来自: 上海
-
最新评论
-
sonichy:
可以用来设计显示隐藏文件
java中File.listFiles(FileFilter) FileFilter的使用 -
fbbobo:
ftp.voidcmd('TYPE I')
python 开发的通过FTP上传下载文件类 -
LinApex:
文件内容一次性读入,性能消耗非常大
java中对文件计算MD5 -
zlb824:
问楼主一个问题,先定位于264行,如下:OutputStrea ...
org.apache.commons.net.ftp包开发FTP客户端,实现断点续传,中文支持 -
6214832:
楼主,在Linux下搭建的服务器上上传下载没有问题,但是用xl ...
org.apache.commons.net.ftp包开发FTP客户端,实现断点续传,中文支持
利用org.apache.commons.net.ftp包实现一个简单的ftp客户端实用类。主要实现一下功能
1.支持上传下载。支持断点续传
2.支持进度汇报
3.支持对于中文目录及中文文件创建的支持。
具体请看代码,上面有详细的注释。简化版本请参见http://zhouzaibao.iteye.com/blog/342766
枚举类UploadStatus代码
public enum UploadStatus { Create_Directory_Fail, //远程服务器相应目录创建失败 Create_Directory_Success, //远程服务器闯将目录成功 Upload_New_File_Success, //上传新文件成功 Upload_New_File_Failed, //上传新文件失败 File_Exits, //文件已经存在 Remote_Bigger_Local, //远程文件大于本地文件 Upload_From_Break_Success, //断点续传成功 Upload_From_Break_Failed, //断点续传失败 Delete_Remote_Faild; //删除远程文件失败 }
枚举类DownloadStatus代码
public enum DownloadStatus { Remote_File_Noexist, //远程文件不存在 Local_Bigger_Remote, //本地文件大于远程文件 Download_From_Break_Success, //断点下载文件成功 Download_From_Break_Failed, //断点下载文件失败 Download_New_Success, //全新下载文件成功 Download_New_Failed; //全新下载文件失败 }
核心FTP代码
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.RandomAccessFile; import open.mis.data.DownloadStatus; import open.mis.data.UploadStatus; import org.apache.commons.net.PrintCommandListener; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; /** * 支持断点续传的FTP实用类 * @author BenZhou * @version 0.1 实现基本断点上传下载 * @version 0.2 实现上传下载进度汇报 * @version 0.3 实现中文目录创建及中文文件创建,添加对于中文的支持 */ public class ContinueFTP { public FTPClient ftpClient = new FTPClient(); public ContinueFTP(){ //设置将过程中使用到的命令输出到控制台 this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out))); } /** * 连接到FTP服务器 * @param hostname 主机名 * @param port 端口 * @param username 用户名 * @param password 密码 * @return 是否连接成功 * @throws IOException */ public boolean connect(String hostname,int port,String username,String password) throws IOException{ ftpClient.connect(hostname, port); ftpClient.setControlEncoding("GBK"); if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){ if(ftpClient.login(username, password)){ return true; } } disconnect(); return false; } /** * 从FTP服务器上下载文件,支持断点续传,上传百分比汇报 * @param remote 远程文件路径 * @param local 本地文件路径 * @return 上传的状态 * @throws IOException */ public DownloadStatus download(String remote,String local) throws IOException{ //设置被动模式 ftpClient.enterLocalPassiveMode(); //设置以二进制方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); DownloadStatus result; //检查远程文件是否存在 FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("GBK"),"iso-8859-1")); if(files.length != 1){ System.out.println("远程文件不存在"); return DownloadStatus.Remote_File_Noexist; } long lRemoteSize = files[0].getSize(); File f = new File(local); //本地存在文件,进行断点下载 if(f.exists()){ long localSize = f.length(); //判断本地文件大小是否大于远程文件大小 if(localSize >= lRemoteSize){ System.out.println("本地文件大于远程文件,下载中止"); return DownloadStatus.Local_Bigger_Remote; } //进行断点续传,并记录状态 FileOutputStream out = new FileOutputStream(f,true); ftpClient.setRestartOffset(localSize); InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"),"iso-8859-1")); byte[] bytes = new byte[1024]; long step = lRemoteSize /100; long process=localSize /step; int c; while((c = in.read(bytes))!= -1){ out.write(bytes,0,c); localSize+=c; long nowProcess = localSize /step; if(nowProcess > process){ process = nowProcess; if(process % 10 == 0) System.out.println("下载进度:"+process); //TODO 更新文件下载进度,值存放在process变量中 } } in.close(); out.close(); boolean isDo = ftpClient.completePendingCommand(); if(isDo){ result = DownloadStatus.Download_From_Break_Success; }else { result = DownloadStatus.Download_From_Break_Failed; } }else { OutputStream out = new FileOutputStream(f); InputStream in= ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"),"iso-8859-1")); byte[] bytes = new byte[1024]; long step = lRemoteSize /100; long process=0; long localSize = 0L; int c; while((c = in.read(bytes))!= -1){ out.write(bytes, 0, c); localSize+=c; long nowProcess = localSize /step; if(nowProcess > process){ process = nowProcess; if(process % 10 == 0) System.out.println("下载进度:"+process); //TODO 更新文件下载进度,值存放在process变量中 } } in.close(); out.close(); boolean upNewStatus = ftpClient.completePendingCommand(); if(upNewStatus){ result = DownloadStatus.Download_New_Success; }else { result = DownloadStatus.Download_New_Failed; } } return result; } /** * 上传文件到FTP服务器,支持断点续传 * @param local 本地文件名称,绝对路径 * @param remote 远程文件路径,使用/home/directory1/subdirectory/file.ext 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 * @return 上传结果 * @throws IOException */ public UploadStatus upload(String local,String remote) throws IOException{ //设置PassiveMode传输 ftpClient.enterLocalPassiveMode(); //设置以二进制流的方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.setControlEncoding("GBK"); UploadStatus result; //对远程目录的处理 String remoteFileName = remote; if(remote.contains("/")){ remoteFileName = remote.substring(remote.lastIndexOf("/")+1); //创建服务器远程目录结构,创建失败直接返回 if(CreateDirecroty(remote, ftpClient)==UploadStatus.Create_Directory_Fail){ return UploadStatus.Create_Directory_Fail; } } //检查远程是否存在文件 FTPFile[] files = ftpClient.listFiles(new String(remoteFileName.getBytes("GBK"),"iso-8859-1")); if(files.length == 1){ long remoteSize = files[0].getSize(); File f = new File(local); long localSize = f.length(); if(remoteSize==localSize){ return UploadStatus.File_Exits; }else if(remoteSize > localSize){ return UploadStatus.Remote_Bigger_Local; } //尝试移动文件内读取指针,实现断点续传 result = uploadFile(remoteFileName, f, ftpClient, remoteSize); //如果断点续传没有成功,则删除服务器上文件,重新上传 if(result == UploadStatus.Upload_From_Break_Failed){ if(!ftpClient.deleteFile(remoteFileName)){ return UploadStatus.Delete_Remote_Faild; } result = uploadFile(remoteFileName, f, ftpClient, 0); } }else { result = uploadFile(remoteFileName, new File(local), ftpClient, 0); } return result; } /** * 断开与远程服务器的连接 * @throws IOException */ public void disconnect() throws IOException{ if(ftpClient.isConnected()){ ftpClient.disconnect(); } } /** * 递归创建远程服务器目录 * @param remote 远程服务器文件绝对路径 * @param ftpClient FTPClient对象 * @return 目录创建是否成功 * @throws IOException */ public UploadStatus CreateDirecroty(String remote,FTPClient ftpClient) throws IOException{ UploadStatus status = UploadStatus.Create_Directory_Success; String directory = remote.substring(0,remote.lastIndexOf("/")+1); if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(new String(directory.getBytes("GBK"),"iso-8859-1"))){ //如果远程目录不存在,则递归创建远程服务器目录 int start=0; int end = 0; if(directory.startsWith("/")){ start = 1; }else{ start = 0; } end = directory.indexOf("/",start); while(true){ String subDirectory = new String(remote.substring(start,end).getBytes("GBK"),"iso-8859-1"); if(!ftpClient.changeWorkingDirectory(subDirectory)){ if(ftpClient.makeDirectory(subDirectory)){ ftpClient.changeWorkingDirectory(subDirectory); }else { System.out.println("创建目录失败"); return UploadStatus.Create_Directory_Fail; } } start = end + 1; end = directory.indexOf("/",start); //检查所有目录是否创建完毕 if(end <= start){ break; } } } return status; } /** * 上传文件到服务器,新上传和断点续传 * @param remoteFile 远程文件名,在上传之前已经将服务器工作目录做了改变 * @param localFile 本地文件File句柄,绝对路径 * @param processStep 需要显示的处理进度步进值 * @param ftpClient FTPClient引用 * @return * @throws IOException */ public UploadStatus uploadFile(String remoteFile,File localFile,FTPClient ftpClient,long remoteSize) throws IOException{ UploadStatus status; //显示进度的上传 long step = localFile.length() / 100; long process = 0; long localreadbytes = 0L; RandomAccessFile raf = new RandomAccessFile(localFile,"r"); OutputStream out = ftpClient.appendFileStream(new String(remoteFile.getBytes("GBK"),"iso-8859-1")); //断点续传 if(remoteSize>0){ ftpClient.setRestartOffset(remoteSize); process = remoteSize /step; raf.seek(remoteSize); localreadbytes = remoteSize; } byte[] bytes = new byte[1024]; int c; while((c = raf.read(bytes))!= -1){ out.write(bytes,0,c); localreadbytes+=c; if(localreadbytes / step != process){ process = localreadbytes / step; System.out.println("上传进度:" + process); //TODO 汇报上传状态 } } out.flush(); raf.close(); out.close(); boolean result =ftpClient.completePendingCommand(); if(remoteSize > 0){ status = result?UploadStatus.Upload_From_Break_Success:UploadStatus.Upload_From_Break_Failed; }else { status = result?UploadStatus.Upload_New_File_Success:UploadStatus.Upload_New_File_Failed; } return status; } public static void main(String[] args) { ContinueFTP myFtp = new ContinueFTP(); try { myFtp.connect("192.168.21.181", 21, "nid", "123"); // myFtp.ftpClient.makeDirectory(new String("电视剧".getBytes("GBK"),"iso-8859-1")); // myFtp.ftpClient.changeWorkingDirectory(new String("电视剧".getBytes("GBK"),"iso-8859-1")); // myFtp.ftpClient.makeDirectory(new String("走西口".getBytes("GBK"),"iso-8859-1")); // System.out.println(myFtp.upload("E:\\yw.flv", "/yw.flv",5)); // System.out.println(myFtp.upload("E:\\走西口24.mp4","/央视走西口/新浪网/走西口24.mp4")); System.out.println(myFtp.download("/央视走西口/新浪网/走西口24.mp4", "E:\\走西口242.mp4")); myFtp.disconnect(); } catch (IOException e) { System.out.println("连接FTP出错:"+e.getMessage()); } } }
评论
23 楼
zlb824
2012-07-12
问楼主一个问题,先定位于264行,如下:
OutputStream out = ftpClient.appendFileStream(new String(remoteFile.getBytes("GBK"),"iso-8859-1"));
这一句在执行的时候返回的是null,找了一下API文档,发现是因为远程文件不存在。所以,这里我有一个疑问,难道还得先手动在服务器上创建此文件才能再进行上传吗?
OutputStream out = ftpClient.appendFileStream(new String(remoteFile.getBytes("GBK"),"iso-8859-1"));
这一句在执行的时候返回的是null,找了一下API文档,发现是因为远程文件不存在。所以,这里我有一个疑问,难道还得先手动在服务器上创建此文件才能再进行上传吗?
22 楼
6214832
2012-03-26
楼主,在Linux下搭建的服务器上上传下载没有问题,但是用xlight搭了个ftp服务器,用这个代码出了很多问题,是为什么呢?
21 楼
xiongshulan
2011-10-26
好文章 多谢 楼主
20 楼
ruijin5566
2011-09-23
很好,学习了。就是上传文件为中文名时控制台会输出乱码。
请问楼主:
我从本地上传文件时会重命名文件名为:本机IP地址+现在的时间,如127.0.0.1.2011-9-23-17-33。这时如果连接中断,继续上传的时候所上传的文件名已经改变了,那么怎么实现断点续传呢?
还有我先上传文件到FTP临时目录temp下,上传完成后再将临时目录下的文件转移到正式目录下,有什么方法可以实现?
望楼主解答,感激不尽!
请问楼主:
我从本地上传文件时会重命名文件名为:本机IP地址+现在的时间,如127.0.0.1.2011-9-23-17-33。这时如果连接中断,继续上传的时候所上传的文件名已经改变了,那么怎么实现断点续传呢?
还有我先上传文件到FTP临时目录temp下,上传完成后再将临时目录下的文件转移到正式目录下,有什么方法可以实现?
望楼主解答,感激不尽!
19 楼
nolongerc
2010-11-22
我想请问FTP 上传或下载 操作的间隔时间 稍有几分钟 FTP response 421 received. Server closed connection.
18 楼
zhouzaibao
2010-03-06
hanmo110 写道
楼主你好,当我上传断网后,网再连接时,再次上传不法续传,出现Cannot create file错误,请指教。谢谢!
在此上传不是重新创建文件上传,而是打开文件继续写入,你检查该文件是否被占用,然后看看逻辑结构。
17 楼
hanmo110
2010-03-05
楼主你好,当我上传断网后,网再连接时,再次上传不法续传,出现Cannot create file错误,请指教。谢谢!
16 楼
lt0604
2010-02-08
chai_spring1129 写道
我在本地上传时没错,可代码放到服务器上,上传找不到客户端的文件,出现“系统找不到指定文件”
在web项目里面不能这样调用,你的web客户端根本就没有class文件,你调用的是服务器的class文件(相对于FTP服务器来说,你的wen服务器才是真正的FtpClient),做WEB的FTP上传需要web客户端调用java applet。
15 楼
zhouzaibao
2010-01-21
331008019 写道
我试了一下, 不知道为什么在我机器上不能创建中文目录
你慢慢调试一下,把错误信息打印出来吧,我这里是没有任何问题的。
14 楼
331008019
2010-01-12
我试了一下, 不知道为什么在我机器上不能创建中文目录
13 楼
zhouzaibao
2009-12-23
mzyp 写道
zhouzaibao 写道
chai_spring1129 写道
我在本地上传时没错,可代码放到服务器上,上传找不到客户端的文件,出现“系统找不到指定文件”
这个就是你部署的问题了,建议你仔细分析一下错误信息。
我也遇到同样问题,本机做web服务器,一切正常,但部署到服务器后,再从客户端IE上传时,就提示“系统找不到指定文件”,给我的感觉是,好象未能通过WEB页面访问本地文件,楼主说是部署问题,能否详加描述,不胜感激,再次鸣谢
web我没有部署过,具体的你就看看异常吧,我觉得
12 楼
mzyp
2009-12-15
zhouzaibao 写道
chai_spring1129 写道
我在本地上传时没错,可代码放到服务器上,上传找不到客户端的文件,出现“系统找不到指定文件”
这个就是你部署的问题了,建议你仔细分析一下错误信息。
我也遇到同样问题,本机做web服务器,一切正常,但部署到服务器后,再从客户端IE上传时,就提示“系统找不到指定文件”,给我的感觉是,好象未能通过WEB页面访问本地文件,楼主说是部署问题,能否详加描述,不胜感激,再次鸣谢
11 楼
zhouzaibao
2009-12-01
chai_spring1129 写道
我在本地上传时没错,可代码放到服务器上,上传找不到客户端的文件,出现“系统找不到指定文件”
这个就是你部署的问题了,建议你仔细分析一下错误信息。
10 楼
chai_spring1129
2009-11-30
我在本地上传时没错,可代码放到服务器上,上传找不到客户端的文件,出现“系统找不到指定文件”
9 楼
zhouzaibao
2009-07-02
caiway 写道
楼主,除了需要Commons net2.0的jar包,能够把其他需要的相关的jar包列出来吗?方便大家学习使用。
谢谢!
谢谢!
因为项目过大,不方便,我也不想清理了
8 楼
caiway
2009-06-25
楼主,除了需要Commons net2.0的jar包,能够把其他需要的相关的jar包列出来吗?方便大家学习使用。
谢谢!
谢谢!
7 楼
zhouzaibao
2009-06-10
因为是目录切换问题,第一次的时候你的工作目录已经切换了
第二次你需要切换到根目录才可以,不然他就找不到文件了
第二次你需要切换到根目录才可以,不然他就找不到文件了
6 楼
gousheng12345
2009-06-10
楼主你好,请问为什么我的main函数写成这个样
public static void main(String[] args) {
JContinueFTPUtil myFtp = new JContinueFTPUtil();
System.out.println("第一次");
try
{
myFtp.connect("127.0.0.1", 21, "gou", "gou");
System.out.println(myFtp.download("("/央视走西口/新浪网/走西口24.mp4", "D:\\走西口24.mp4"));
myFtp.disconnect();
}
catch (IOException e)
{
System.out.println("连接FTP出错:"+e.getMessage());
}
System.out.println("第二次");
try {
myFtp.connect("127.0.0.1", 21, "gou", "gou");
System.out.println(myFtp.download("/图片/地质图.jpg", "D:\\地质图.jpg"));
myFtp.disconnect();
}
catch (IOException e)
{
System.out.println("连接FTP出错:"+e.getMessage());
}
}
连续调用的时候,第一次可以正确的传输文件,二第二次的时候就会报 远程文件不存在
Remote_File_Noexist 这样的错误呢,我的服务器端已经有了这样的文件了,请赐教,谢谢
public static void main(String[] args) {
JContinueFTPUtil myFtp = new JContinueFTPUtil();
System.out.println("第一次");
try
{
myFtp.connect("127.0.0.1", 21, "gou", "gou");
System.out.println(myFtp.download("("/央视走西口/新浪网/走西口24.mp4", "D:\\走西口24.mp4"));
myFtp.disconnect();
}
catch (IOException e)
{
System.out.println("连接FTP出错:"+e.getMessage());
}
System.out.println("第二次");
try {
myFtp.connect("127.0.0.1", 21, "gou", "gou");
System.out.println(myFtp.download("/图片/地质图.jpg", "D:\\地质图.jpg"));
myFtp.disconnect();
}
catch (IOException e)
{
System.out.println("连接FTP出错:"+e.getMessage());
}
}
连续调用的时候,第一次可以正确的传输文件,二第二次的时候就会报 远程文件不存在
Remote_File_Noexist 这样的错误呢,我的服务器端已经有了这样的文件了,请赐教,谢谢
5 楼
h819
2009-03-16
谢谢,楼主很热情,更新很快

4 楼
zhouzaibao
2009-03-16
h819 写道
open.mis.data.DownloadStatus
open.mis.data.UploadStatus
两个包类在哪里?
另外,是否根据最新的 commons net 2.0 改写过了?
目前已经更新文档,两个包也在上面
发表评论
-
jconsole连接远程resin应用
2010-06-02 15:16 3564最近做一个web服务 ... -
log4j中配置将日志打印到不同的文件
2009-12-29 15:53 5757原文出处: http://hi.baidu.com/sihi ... -
java中GMT时间转换为long类型
2009-06-09 11:33 5935计算机世界当中的时间这里我也没有搞明白 ,如果希望搞明 ... -
java程序命令行启动方法
2009-05-06 10:07 7900刚开始学习java的朋友一定很想知道除了在IDE中点击 ... -
java开发FTP客户端列出指定目录下面所有文件
2009-04-07 17:09 14135利用commons2.0(http://commons ... -
commons2.0FTP组件开发上传时间过长程序假死解决方案
2009-03-24 15:50 4822在我前一篇blog中http://zhouzaibao ... -
使用apache commons 2.0 net组件开发ftp上传大文件使程序假死
2009-03-21 10:21 2570最近使用apache上面的commons 2.0开发 ... -
获得字符串表示的布尔表达式的值
2009-03-20 11:56 1479在实际的开发中有些时候需要计算字符串表示的布尔表达式的 ... -
java在一行固定输出,比如在一行打印进度
2009-03-13 18:36 9822在java中要实现在控制台一行中定点输出,因为我想实现 ... -
java读取控制台输入
2009-03-13 17:41 3377java中获得控制台输入不是很方便,只从1.5版本后才 ... -
java中File.listFiles(FileFilter) FileFilter的使用
2009-03-11 18:28 25781在我们调用java库中的File.listFiles( ... -
jdom结合xpath读取xml数据内容
2009-03-09 16:43 2198上次说到如果XML文件的层次比较多,直接通过 ... -
java环境变量及ant环境变量设置
2009-03-05 15:14 4302在eclipse中运行java程序有些时候确实不爽,比较喜欢的 ... -
java中对文件计算MD5
2009-03-05 14:42 7372import java.io.File; import jav ... -
java中ftp断点上传功能的实现
2009-03-04 11:14 14733主要使用apache中的net包来实现。网址http: ... -
重定向printStackTree的输出到字符串
2009-02-24 18:16 2075在实际的开发为了捕获异常,经常需要使用try{}catch{} ... -
log4j使用指南
2009-01-09 17:12 1135Log4J的配置文件(Configurat ... -
java中处理文件相关
2008-11-28 14:48 8401.使用缓冲区打开文件读。 BufferedReade ... -
关闭使用httpclient中过多日志
2008-11-22 13:17 11070在使用httpclient建立http连接的过程中,默 ... -
个人总结Java中需要注意的问题(不断补充中)
2008-11-20 21:44 1038其实这些东西估计大家都知道,将我遇到的问题整理一下。 1.字符 ...
相关推荐
python学习资源
jfinal-undertow 用于开发、部署由 jfinal 开发的 web 项目
基于Andorid的音乐播放器项目设计(国外开源)实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
python学习资源
python学习资源
python学习一些项目和资源
【毕业设计】java-springboot+vue家具销售平台实现源码(完整前后端+mysql+说明文档+LunW).zip
HTML+CSS+JavaScarip开发的前端网页源代码
python学习资源
【毕业设计】java-springboot-vue健身房信息管理系统源码(完整前后端+mysql+说明文档+LunW).zip
成绩管理系统C/Go。大学生期末小作业,指针实现,C语言版本(ANSI C)和Go语言版本
1_基于大数据的智能菜品个性化推荐与点餐系统的设计与实现.docx
【毕业设计】java-springboot-vue交流互动平台实现源码(完整前后端+mysql+说明文档+LunW).zip
内容概要:本文主要探讨了在高并发情况下如何设计并优化火车票秒杀系统,确保系统的高性能与稳定性。通过对比分析三种库存管理模式(下单减库存、支付减库存、预扣库存),强调了预扣库存结合本地缓存及远程Redis统一库存的优势,同时介绍了如何利用Nginx的加权轮询策略、MQ消息队列异步处理等方式降低系统压力,保障交易完整性和数据一致性,防止超卖现象。 适用人群:具有一定互联网应用开发经验的研发人员和技术管理人员。 使用场景及目标:适用于电商、票务等行业需要处理大量瞬时并发请求的业务场景。其目标在于通过合理的架构规划,实现在高峰期保持平台的稳定运行,保证用户体验的同时最大化销售额。 其他说明:文中提及的技术细节如Epoll I/O多路复用模型以及分布式系统中的容错措施等内容,对于深入理解大规模并发系统的构建有着重要指导意义。
基于 OpenCV 和 PyTorch 的深度车牌识别
【毕业设计-java】springboot-vue教学资料管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
此数据集包含有关出租车行程的详细信息,包括乘客人数、行程距离、付款类型、车费金额和行程时长。它可用于各种数据分析和机器学习应用程序,例如票价预测和乘车模式分析。
把代码放到Word中,通过开发工具——Visual Basic——插入模块,粘贴在里在,把在硅基流动中申请的API放到VBA代码中。在Word中,选择一个问题,运行这个DeepSeekV3的宏就可以实现在线问答
【毕业设计】java-springboot+vue机动车号牌管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot-vue交通管理在线服务系统的开发源码(完整前后端+mysql+说明文档+LunW).zip