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服務器本身是否支持斷點續傳。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM