java ftp分片续传_edtftpj让Java上传FTP文件支持断点续传

在用Java实现FTP上传文件功能时,特别是上传大文件的时候,可以需要这样的功能:程序在上传的过程中意外终止了,文件传了一大半,想从断掉了地方继续传;或者想做类似迅雷下载类似的功能,文件太大,今天传一半,睡一觉去先,明天继续传。

Java上传FTP文件,用的比较多的工具是apache的commons-net。如果想用commons-net实现FTP上传的断点续传还是有点麻烦。

除了commons-net之外,还有很多非常优秀的FTP工具,这里使用edtftpj这个工具来实现断点续传。

1354691640_1889.jpg

这里下载免费版,相对收费的版本少一些功能,但是足够使用了。

下载完成,解压后,在lib文件夹下,可以看到edtftpj.jar文件。放到项目中去。

下面是FTP断点续传上传文件的代码:

importjava.io.File;importjava.io.IOException;importcom.enterprisedt.net.ftp.FTPException;importcom.enterprisedt.net.ftp.FTPTransferType;importcom.enterprisedt.net.ftp.FileTransferClient;importcom.enterprisedt.net.ftp.WriteMode;public classFtpTool

{/*** edtptpj的上传工具*/

privateFileTransferClient ftp;/*** FTP IP*/

privateString ip;/*** FTP端口号*/

private intport;/*** FTP用户名*/

privateString username;/*** FTP密码*/

privateString password;/***

* 构造方法,初始化FTP IP、FTP端口、FTP用户名、FTP密码

*

*@paramip

* FTP IP

*@paramport

* FTP端口

*@paramusername

* FTP用户名

*@parampassword

* FTP密码*/

public FtpTool(String ip, intport, String username, String password)

{this.ip =ip;this.port =port;this.username =username;this.password =password;

}/***

* 连接FTP

*

*@throwsFTPException

* FTPException

*@throwsIOException

* IOException

*@authorXXG*/

public void connect() throwsFTPException, IOException

{

ftp= newFileTransferClient();

ftp.setRemoteHost(ip);

ftp.setRemotePort(port);

ftp.setUserName(username);

ftp.setPassword(password);//设置二进制方式上传

ftp.setContentType(FTPTransferType.BINARY);

ftp.connect();

}/***

* 上传本地文件到FTP服务器上,文件名与原文件名相同

*

*@paramlocalFile

* 本地文件路径

*@paramremoteFilePath

* 上传到FTP服务器所在目录(该目录必须已经存在)

*@throwsIOException

* IOException

*@throwsFTPException

* FTPException

*@authorXXG

**/

public voidresumeUpload(String localFile, String remoteFilePath)throwsFTPException, IOException

{

File local= newFile(localFile);//FTP文件完整路径

String remoteFileFullPath = remoteFilePath +local.getName();//上传:WriteMode.RESUME表示断点续传

ftp.uploadFile(localFile, remoteFileFullPath, WriteMode.RESUME);

}/***

* 关闭FTP连接

*

*@throwsIOException

* IOException

*@throwsFTPException

* FTPException

*@authorXXG*/

public void close() throwsFTPException, IOException

{

ftp.disconnect();

}

}

下面是main方法测试断点续传功能(测试的时候可以在上传的中途关闭程序,再开始上传,看是否在续传):

public static voidmain(String[] args)

{

FtpTool ftpTool= new FtpTool("192.168.7.49", 21, "editor", "tvm_editor");try{

ftpTool.connect();try{

System.out.println("开始上传文件...");

ftpTool.resumeUpload("E:\\软件\\eclipse-jee-indigo-SR2-win32.zip", "wucao/aa/");

System.out.println("完成上传文件。");

}catch(Exception e)

{

e.printStackTrace();

}finally{

ftpTool.close();

}

}catch(Exception e)

{

e.printStackTrace();

}

}

在上面的代码中,ftp.uploadFile(localFile,remoteFileFullPath, WriteMode.RESUME) 这句代码中的第三个参数WriteMode.RESUME即表示断点续传。

除了WriteMode.RESUME方式上传,还有其他两种方式:

WriteMode.OVERWRITE:覆盖上传,就是上次如果没传完,这次删掉上次的重新传。

WriteMode.APPEND:续写,就是如果FTP服务器上存在同名的文件,就接着它后面续加。

注意续写和断点续传区分:比如有个100M的文件上传,上次传了80M,那么用RESUME方式的话,传完剩下的20M就完成了,但对于APPEND,它会接在80M后面重新传,最后成功的时候FTP上的文件大小是180M。

最后要注意的是:并不是所有FTP服务器都支持断点续传,有断点续传的服务器也可以关闭断点续传的功能,不支持断点续传的服务器使用RESUME会抛出异常。所以,在使用FTP断点续传之前,首先要确认一下FTP服务器本身是否支持断点续传。

本文转自:http://blog.csdn.net/kazeik/article/details/8260067

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中实现FTP断点续传可以使用Apache Commons Net库中的FTPClient类。以下是一个简单的示例代码: ``` import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import java.io.*; public class FTPResumeExample { private static final String server = "ftp.example.com"; private static final int port = 21; private static final String username = "username"; private static final String password = "password"; private static final String remoteFilePath = "/path/to/file"; private static final String localFilePath = "/path/to/save/file"; public static void main(String[] args) { FTPClient ftpClient = new FTPClient(); try { ftpClient.connect(server, port); int replyCode = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(replyCode)) { System.out.println("FTP server refused connection."); return; } boolean success = ftpClient.login(username, password); if (!success) { System.out.println("Could not login to the FTP server."); return; } // 检查本地文件是否存在,如果存在,则断点续传 File localFile = new File(localFilePath); long resumePosition = 0; if (localFile.exists()) { resumePosition = localFile.length(); ftpClient.setRestartOffset(resumePosition); } // 下载文件 OutputStream outputStream = new FileOutputStream(localFile, true); InputStream inputStream = ftpClient.retrieveFileStream(remoteFilePath); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); ftpClient.completePendingCommand(); ftpClient.logout(); ftpClient.disconnect(); System.out.println("File downloaded successfully."); } catch (IOException e) { System.out.println("Error occurred: " + e.getMessage()); } } } ``` 在上述示例代码中,我们使用`ftpClient.retrieveFileStream(remoteFilePath)`方法获取远程文件的输入流,并将其写入本地文件的输出流中。如果本地文件已存在,则通过`ftpClient.setRestartOffset(resumePosition)`方法设置断点续传的位置。 请根据实际情况修改示例代码中的服务器地址、端口、用户名、密码、远程文件路径和本地文件路径。另外,请确保项目中包含Apache Commons Net库的依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值