edtftpj让Java上传FTP文件支持断点续传

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

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

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

下载:http://www.enterprisedt.com/

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

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

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

import java.io.File;  
import java.io.IOException;  
  
import com.enterprisedt.net.ftp.FTPException;  
import com.enterprisedt.net.ftp.FTPTransferType;  
import com.enterprisedt.net.ftp.FileTransferClient;  
import com.enterprisedt.net.ftp.WriteMode;  
  
public class FtpTool  
{  
    /** 
     * edtptpj的上传工具 
     */  
    private FileTransferClient ftp;  
  
    /** 
     * FTP IP 
     */  
    private String ip;  
  
    /** 
     * FTP端口号 
     */  
    private int port;  
  
    /** 
     * FTP用户名 
     */  
    private String username;  
  
    /** 
     * FTP密码 
     */  
    private String password;  
  
    /** 
     *  
     * 构造方法,初始化FTP IP、FTP端口、FTP用户名、FTP密码 
     *  
     * @param ip 
     *            FTP IP 
     * @param port 
     *            FTP端口 
     * @param username 
     *            FTP用户名 
     * @param password 
     *            FTP密码 
     */  
    public FtpTool(String ip, int port, String username, String password)  
    {  
        this.ip = ip;  
        this.port = port;  
        this.username = username;  
        this.password = password;  
    }  
  
    /** 
     *  
     * 连接FTP 
     *  
     * @throws FTPException 
     *             FTPException 
     * @throws IOException 
     *             IOException 
     * @author XXG 
     */  
    public void connect() throws FTPException, IOException  
    {  
        ftp = new FileTransferClient();  
        ftp.setRemoteHost(ip);  
        ftp.setRemotePort(port);  
        ftp.setUserName(username);  
        ftp.setPassword(password);  
  
        //设置二进制方式上传  
        ftp.setContentType(FTPTransferType.BINARY);  
        ftp.connect();  
    }  
  
    /** 
     *  
     * 上传本地文件到FTP服务器上,文件名与原文件名相同 
     *  
     * @param localFile 
     *            本地文件路径 
     * @param remoteFilePath 
     *            上传到FTP服务器所在目录(该目录必须已经存在) 
     * @throws IOException 
     *             IOException 
     * @throws FTPException 
     *             FTPException 
     * @author XXG 
     *  
     */  
    public void resumeUpload(String localFile, String remoteFilePath)  
            throws FTPException, IOException  
    {  
        File local = new File(localFile);  
          
        //FTP文件完整路径  
        String remoteFileFullPath = remoteFilePath + local.getName();  
          
        //上传:WriteMode.RESUME表示断点续传  
        ftp.uploadFile(localFile, remoteFileFullPath, WriteMode.RESUME);  
    }  
  
    /** 
     *  
     * 关闭FTP连接 
     *  
     * @throws IOException 
     *             IOException 
     * @throws FTPException 
     *             FTPException 
     * @author XXG 
     */  
    public void close() throws FTPException, IOException  
    {  
        ftp.disconnect();  
    }  
}

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

public static void main(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服务器本身是否支持断点续传。

本文转自:https://www.cnblogs.com/dreammyle/p/4257005.html

转载于:https://www.cnblogs.com/sanluorenjian/p/10249999.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,我们可以使用 Apache Commons Net 库来实现 FTP 断点续传功能。具体实现步骤如下: 1. 创建 FTPClient 对象,并连接到 FTP 服务器: ```java FTPClient ftpClient = new FTPClient(); ftpClient.connect(server, port); ftpClient.login(user, password); ``` 2. 进入到 FTP 服务器上的需要上传或下载的目录: ```java ftpClient.changeWorkingDirectory(remoteDir); ``` 3. 在上传或下载文件前,记录上一次传输完成的位置: ```java long restartPosition = ftpClient.getRestartOffset(); ``` 4. 上传或下载文件时,指定 REST 命令参数即可实现断点续传: ```java // 上传文件 try (InputStream inputStream = new FileInputStream(localFile)) { ftpClient.setRestartOffset(restartPosition); ftpClient.storeFile(remoteFile, inputStream); } // 下载文件 try (OutputStream outputStream = new FileOutputStream(localFile, true)) { ftpClient.setRestartOffset(restartPosition); ftpClient.retrieveFile(remoteFile, outputStream); } ``` 需要注意的是,FTP 服务器可能不支持断点续传功能,因此在实现时需要判断服务器的支持情况。 完整的示例代码如下: ```java import java.io.*; import org.apache.commons.net.ftp.*; public class FtpResume { public static void main(String[] args) throws Exception { String server = "ftp.example.com"; int port = 21; String user = "username"; String password = "password"; String remoteDir = "/remote/dir/"; String remoteFile = "test.txt"; String localFile = "test.txt"; FTPClient ftpClient = new FTPClient(); ftpClient.connect(server, port); ftpClient.login(user, password); ftpClient.changeWorkingDirectory(remoteDir); long restartPosition = ftpClient.getRestartOffset(); // 上传文件 try (InputStream inputStream = new FileInputStream(localFile)) { ftpClient.setRestartOffset(restartPosition); ftpClient.storeFile(remoteFile, inputStream); } // 下载文件 try (OutputStream outputStream = new FileOutputStream(localFile, true)) { ftpClient.setRestartOffset(restartPosition); ftpClient.retrieveFile(remoteFile, outputStream); } ftpClient.disconnect(); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值