主要使用apache中的net包来实现。网址http://commons.apache.org/net/。具体包的下载和API文档请看官网。
断点上传就是在上传的过程中设置传输的起始位置。并设置二进制传输。
package apache.net.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; 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; public class ContinueFTP { private 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); if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){ if(ftpClient.login(username, password)){ return true; } } disconnect(); return false; } /** * 从FTP服务器上下载文件 * @param remote 远程文件路径 * @param local 本地文件路径 * @return 是否成功 * @throws IOException */ public boolean download(String remote,String local) throws IOException{ ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); boolean result; File f = new File(local); FTPFile[] files = ftpClient.listFiles(remote); if(files.length != 1){ System.out.println("远程文件不唯一"); return false; } long lRemoteSize = files[0].getSize(); if(f.exists()){ OutputStream out = new FileOutputStream(f,true); System.out.println("本地文件大小为:"+f.length()); if(f.length() >= lRemoteSize){ System.out.println("本地文件大小大于远程文件大小,下载中止"); return false; } ftpClient.setRestartOffset(f.length()); result = ftpClient.retrieveFile(remote, out); out.close(); }else { OutputStream out = new FileOutputStream(f); result = ftpClient.retrieveFile(remote, out); out.close(); } 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); UploadStatus result; //对远程目录的处理 String remoteFileName = remote; if(remote.contains("/")){ remoteFileName = remote.substring(remote.lastIndexOf("/")+1); String directory = remote.substring(0,remote.lastIndexOf("/")+1); if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(directory)){ //如果远程目录不存在,则递归创建远程服务器目录 int start=0; int end = 0; if(directory.startsWith("/")){ start = 1; }else{ start = 0; } end = directory.indexOf("/",start); while(true){ String subDirectory = remote.substring(start,end); 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; } } } } //检查远程是否存在文件 FTPFile[] files = ftpClient.listFiles(remoteFileName); 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; } //尝试移动文件内读取指针,实现断点续传 InputStream is = new FileInputStream(f); if(is.skip(remoteSize)==remoteSize){ ftpClient.setRestartOffset(remoteSize); if(ftpClient.storeFile(remote, is)){ return UploadStatus.Upload_From_Break_Success; } } //如果断点续传没有成功,则删除服务器上文件,重新上传 if(!ftpClient.deleteFile(remoteFileName)){ return UploadStatus.Delete_Remote_Faild; } is = new FileInputStream(f); if(ftpClient.storeFile(remote, is)){ result = UploadStatus.Upload_New_File_Success; }else{ result = UploadStatus.Upload_New_File_Failed; } is.close(); }else { InputStream is = new FileInputStream(local); if(ftpClient.storeFile(remoteFileName, is)){ result = UploadStatus.Upload_New_File_Success; }else{ result = UploadStatus.Upload_New_File_Failed; } is.close(); } return result; } /** * 断开与远程服务器的连接 * @throws IOException */ public void disconnect() throws IOException{ if(ftpClient.isConnected()){ ftpClient.disconnect(); } } public static void main(String[] args) { ContinueFTP myFtp = new ContinueFTP(); try { myFtp.connect("192.168.21.171", 21, "test", "test"); System.out.println(myFtp.upload("E:\\VP6.flv", "/MIS/video/VP6.flv")); myFtp.disconnect(); } catch (IOException e) { System.out.println("连接FTP出错:"+e.getMessage()); } } }
相关推荐
JAVA实现FTP断点上传 可以按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构,包含测试代码,非常丰富的一个类库
java实现FTP多线程断点续传,上传下载! - java学习与交流 - j2ee学习网 - j2ee学习网 (2012年5月21日) 用 Java 实现断点续传 (HTTP) (2012年5月21日) Java写的支持断点续传的FTP--crybaby的博客 (2012年5月21日) ...
使用ftp协议实现文件的断点续传上传和下载功能
用java控制FTP实现文件上传,支持断点续传功能!
java FTP多线程 批量 断点续传,使用 1.建一个支持多线程FTP服务端; 如:xxftp有Windows和Linux版本; 2.建一个项目导入文件测试;
Java上传文件到FTP服务器,支持断点续传
java 开发的FTP上传功能,支持断点续传,支持多线程
主要介绍了JAVA实现FTP断点上传的方法,涉及java使用FTP实现文件传输的相关技巧,需要的朋友可以参考下
java中实现ftp下载功能,支持断点下载
java ftp上传下载,支持断点续传,下载后直接运行.....
java实现ftp断点续传,上传文件到FTP服务器,支持断点续传,同时支持LINUX主机,代码里面包括了比较多的java网络操作类,比如连接FTP的常规类、递归创建远程服务器目录 上传文件到服务器,新上传和断点续传操作,远程...
java,minio实现分片上传、秒传、断点续传,附docker安装文档
java相关的 ftp知识 如:ftp服务器、ftp主被动通讯模式、断点续传、单个文件多线程下载
java操作FTP工具类:实现基本断点上传下载、实现上传下载进度汇报、实现中文目录创建及中文文件创建,添加对于中文的支持
功能:断点续传的上传、下载。 运行:TestContinueFtp。 jar包:commons-net-1.4.0.jar 默认为主动模式,占用端口为1080。 备注:含jar包。
文章在比较了一系列FTP客户库的基础上,就其中一个比较通用且功能较强的j-ftp类库,对一些比较常见的功能如进度条、断点续传、内外网的映射、在Applet中回调JavaScript函数等问题进行详细的阐述及代码实现,希望通过...
基于apache commons-net.3.2.jar包开发,能实现ftp断点上传、下载、创建目录、切换目录等功能。 说明:需要安装ftp服务器如server-u,filezila等。直接导出的myeclipse java 工程,导入既可以。 环境:myeclipse8.5+...
支持主被动模式,断点续传,里面是完整例子,含apatche的FTP .jar包