1. 程式人生 > >java使用Apache工具集實現ftp檔案傳輸

java使用Apache工具集實現ftp檔案傳輸

本文主要介紹如何使用Apache工具集commons-net提供的ftp工具實現向ftp伺服器上傳和下載檔案。

一、準備

需要引用commons-net-3.5.jar包。

  • 使用maven匯入:
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.5</version>
</dependency>
  • 手動下載:

二、連線FTP Server

    /**
     * 連線FTP Server
     * @throws IOException
     */
    public static final String ANONYMOUS_USER="anonymous";
    private FTPClient connect(){        
        FTPClient client = new FTPClient();
        try{
            //連線FTP Server
            client.connect(this.host, this.port);
            //登陸
if(this.user==null||"".equals(this.user)){ //使用匿名登陸 client.login(ANONYMOUS_USER, ANONYMOUS_USER); }else{ client.login(this.user, this.password); } //設定檔案格式 client.setFileType(FTPClient.BINARY_FILE_TYPE); //獲取FTP Server 應答
int reply = client.getReplyCode(); if(!FTPReply.isPositiveCompletion(reply)){ client.disconnect(); return null; } //切換工作目錄 changeWorkingDirectory(client); System.out.println("===連線到FTP:"+host+":"+port); }catch(IOException e){ return null; } return client; } /** * 切換工作目錄,遠端目錄不存在時,建立目錄 * @param client * @throws IOException */ private void changeWorkingDirectory(FTPClient client) throws IOException{ if(this.ftpPath!=null&&!"".equals(this.ftpPath)){ boolean ok = client.changeWorkingDirectory(this.ftpPath); if(!ok){ //ftpPath 不存在,手動建立目錄 StringTokenizer token = new StringTokenizer(this.ftpPath,"\\//"); while(token.hasMoreTokens()){ String path = token.nextToken(); client.makeDirectory(path); client.changeWorkingDirectory(path); } } } } /** * 斷開FTP連線 * @param ftpClient * @throws IOException */ public void close(FTPClient ftpClient) throws IOException{ if(ftpClient!=null && ftpClient.isConnected()){ ftpClient.logout(); ftpClient.disconnect(); } System.out.println("!!!斷開FTP連線:"+host+":"+port); }

host:ftp伺服器ip地址
port:ftp伺服器埠
user:登陸使用者
password:登陸密碼
登陸使用者為空時,使用匿名使用者登陸。
ftpPath:ftp路徑,ftp路徑不存在時自動建立,如果是多層目錄結構,需要迭代建立目錄。

三、上傳檔案

    /**
     * 上傳檔案
     * @param targetName 上傳到ftp檔名
     * @param localFile 本地檔案路徑
     * @return
     */
    public boolean upload(String targetName,String localFile){
        //連線ftp server
        FTPClient ftpClient = connect();

        if(ftpClient==null){
            System.out.println("連線FTP伺服器["+host+":"+port+"]失敗!");
            return false;
        }
        File file = new File(localFile);
        //設定上傳後文件名
        if(targetName==null||"".equals(targetName))
            targetName = file.getName();
        FileInputStream fis = null;
        try{
            long now = System.currentTimeMillis();
            //開始上傳檔案
            fis = new FileInputStream(file);
            System.out.println(">>>開始上傳檔案:"+file.getName());
            boolean ok = ftpClient.storeFile(targetName, fis);
            if(ok){//上傳成功
                long times = System.currentTimeMillis() - now;
                System.out.println(String.format(">>>上傳成功:大小:%s,上傳時間:%d秒", formatSize(file.length()),times/1000));
            }else//上傳失敗
                System.out.println(String.format(">>>上傳失敗:大小:%s", formatSize(file.length())));
        }catch(IOException e){
            System.err.println(String.format(">>>上傳失敗:大小:%s", formatSize(file.length())));
            e.printStackTrace();
            return false;
        }finally{
            try{
                if(fis!=null)
                    fis.close();
                close(ftpClient);
            }catch(Exception e){}
        }
        return true;
    }

四、下載檔案

    /**
     * 下載檔案
     * @param localPath 本地存放路徑
     * @return
     */
    public int download(String localPath){
        //  連線ftp server
        FTPClient ftpClient = connect();
        if(ftpClient==null){
            System.out.println("連線FTP伺服器["+host+":"+port+"]失敗!");
            return 0;
        }

        File dir = new File(localPath);
        if(!dir.exists())
            dir.mkdirs();
        FTPFile[] ftpFiles = null;
        try{
            ftpFiles = ftpClient.listFiles();
            if(ftpFiles==null||ftpFiles.length==0)
                return 0;
        }catch(IOException e){
            return 0;
        }
        int c = 0;
        for(int i=0;i<ftpFiles.length;i++){
            FileOutputStream fos = null;
            try{
                String name = ftpFiles[i].getName();
                fos = new FileOutputStream(new File(dir.getAbsolutePath()+File.separator+name));
                System.out.println("<<<開始下載檔案:"+name);

                long now = System.currentTimeMillis();
                boolean ok = ftpClient.retrieveFile(new String(name.getBytes("UTF-8"),"ISO-8859-1"), fos);
                if(ok){//下載成功
                    long times = System.currentTimeMillis() - now;
                    System.out.println(String.format("<<<下載成功:大小:%s,上傳時間:%d秒", formatSize(ftpFiles[i].getSize()),times/1000));
                    c++;
                }else{
                    System.out.println("<<<下載失敗");
                }
            }catch(IOException e){
                System.err.println("<<<下載失敗");
                e.printStackTrace();
            }finally{
                try{
                    if(fos!=null)
                        fos.close();
                    close(ftpClient);
                }catch(Exception e){}
            }
        }
        return c;
    }

格式化檔案大小

private static final DecimalFormat DF = new DecimalFormat("#.##");
    /**
     * 格式化檔案大小(B,KB,MB,GB)
     * @param size
     * @return
     */
    private String formatSize(long size){
        if(size<1024){
            return size + " B";
        }else if(size<1024*1024){
            return size/1024 + " KB";
        }else if(size<1024*1024*1024){
            return (size/(1024*1024)) + " MB";
        }else{
            double gb = size/(1024*1024*1024);
            return DF.format(gb)+" GB";
        }
    }

五、測試

public static void main(String args[]){
        FTPTest ftp = new FTPTest("192.168.1.10",21,null,null,"/temp/2016/12");
        ftp.upload("newFile.rar", "D:/ftp/TeamViewerPortable.rar");
        System.out.println("");
        ftp.download("D:/ftp/");
    }

結果

===連線到FTP192.168.1.10:21
>>>開始上傳檔案:TeamViewerPortable.rar
>>>上傳成功:大小:5 MB,上傳時間:3!!!斷開FTP連線:192.168.1.10:21

===連線到FTP192.168.1.10:21
<<<開始下載檔案:newFile.rar
<<<下載成功:大小:5 MB,上傳時間:4!!!斷開FTP連線:192.168.1.10:21

相關推薦

java使用Apache工具實現ftp檔案傳輸

本文主要介紹如何使用Apache工具集commons-net提供的ftp工具實現向ftp伺服器上傳和下載檔案。 一、準備 需要引用commons-net-3.5.jar包。 使用ma

python基於併發與socket實現遠端檔案傳輸程式

FTP程式 Client: * bin/start.py 程式入口 * conf/配置檔案存放 * core/ * auth.py 登陸,註冊以及上傳下載檢視當前資料夾下檔案以及刪除功能存放 * cline.py 與服務端通訊 * home 本地使用者目錄 Server: * bin/

C#實現FTP檔案的上傳、下載功能、新建目錄以及檔案的刪除

轉載至:https://www.cnblogs.com/zhenzaizai/p/7434669.html using  System; using  System.Collections.Generic;

FTP檔案傳輸服務

FTP檔案傳輸服務   FTP連線及傳輸模式 1 控制連線:TCP 21,用於傳送FTP命令資訊 2 資料連線:TCP 20,用於上傳、下載資料 3 資料連線建立型別:

Jquery+Django 實現 CORS 檔案傳輸

場景描述 前端處理過程 後端處理過程 場景描述 遇到這樣一個開發場景,伺服器A作為一個web server(可以看做master)而伺服器B 作為

如何實現高速檔案傳輸?用一個比喻向你說清楚

日常工作中,我們經常要給外地分/總公司的同事、眾多合作伙伴傳輸檔案。檔案稍微大一點經常傳輸速度很慢,如果要的不急還能忍受,如果在限定時間內很快傳給對方,這種龜速傳輸會讓人崩潰。 怎麼解決這個問題呢? 高速檔案傳輸可以簡單具象成三個方面:修一條高速路、修一條不堵車的高速路、買輛重卡拉貨

C#實戰027:socket實現檔案傳輸

前面寫了一個單檔案傳輸的,後來發現當傳送的檔案大於設定的快取空間時,檔案就會出現丟包的現象,導致檔案無法使用,所以為了適應大檔案的傳輸,這裡我將程式碼進行了下修改,實現大檔案傳輸。 不過socket實現大檔案傳輸有個缺點,由於傳輸過程是通過位元組快取傳送,接受也是讀寫位元組,導致整個傳輸過

C#實戰026:socket實現檔案傳輸

    實現簡單的資訊通訊,接下來我們要繼續來是實現檔案的傳輸,同樣這次先試試單個簡單的小檔案傳輸,首先先說說原理,這次我們先對檔案進行檔名獲取,將檔名以資訊傳輸的形式的先傳遞給服務端,目的是讓伺服器知道我們要傳送的檔名及檔案型別,接著再來發送檔案,這裡我們需要將檔案轉化成位元組

多執行緒實現ftp 檔案下載

1 需求: 某個介面的紀錄在ftp 伺服器上,以類別/日期/時間.來存放檔案,而一天可能會產生幾百個檔案,需要下載檔案進行儲存 問題: 1. 這個時候如果同時,要拿幾個類別,某個時間段的資料,就要瘋狂下載了,如果是單執行緒的 2. ftp 一般只允許同一個使用者名稱,同時有幾個程

Java實現FTP檔案的上傳和下載

一、前言: 最近剛好需要實現這個功能:實現ftp的上傳和下載。在網上找了下資料,總結了下。直接上程式碼: 二、程式碼示例: 首先使用到的maven依賴: <dependency>     <groupId>commons-net</gro

Java 實現ftp 檔案上傳、下載和刪除

本文利用apache ftp工具實現檔案的上傳下載和刪除。具體如下: 1、下載相應的jar包      commons-net-1.4.1.jar 2、實現程式碼如下: public class FtpUtils { //ftp伺服器地址

網路程式設計實驗三——TCP實現跨平臺檔案傳輸

一、實驗目的 1.在循環面向連線的程式基礎上,利用tcp完成linux和windows平臺的檔案傳輸。  2.對伺服器程式進行合理的封裝優化實驗步驟。 二、實驗分析 Linux伺服器: 1.首先,建立套接字,並將其繫結到提供服務的埠上,設定為被動模式,將這幾步進

FTP檔案傳輸協議詳解

       FTP 是File Transfer Protocol(檔案傳輸協議)的英文簡稱,而中文簡稱為“文傳協議”。用於Internet上的控制檔案的雙向傳輸。同時,它也是一個應用程式(Application)。基於不同的作業系統有不同的FTP應用程式,而所有這些應用

java 中 FtpClient 實現 FTP 檔案上傳、下載

package ftp; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWrit

QT實現TCP檔案傳輸

傳輸過程中TCP的使用見上一個帖子,介紹一下檔案傳輸 //主要用到了以下標頭檔案 #include <QFileDialog> //該函式返回對話方塊下選擇檔案目錄 QString filePath=QFileDialog::getOpenFileName(this,"open","

網路程式設計——3.TCP/UDP實現跨平臺檔案傳輸

一、實驗目的     在上次檔案傳輸的程式基礎上,利用循環面向連線、迴圈無連線方式完成linux和windows平臺的檔案傳輸,並完成客戶端、伺服器端程式碼的封裝。 二、實驗分析      1.使用TCP實現   在上次實驗基礎上,使用tcp_server.c的程式碼

第二彈——SSH遠端連線和FTP檔案傳輸

上一篇介紹如何獲得一臺阿里雲的雲伺服器ECS,拿到服務氣候,我們就需要進行一些操作了,畢竟伺服器不在身旁,你不能直接訪問伺服器,所以你必須要與伺服器建立連線這樣伺服器才算是你的。所以這篇就講講ssh遠端連線和ftp檔案傳輸。 SSH遠端連線: 其實,我們

socket實現大型檔案傳輸

       最近需要做網路傳輸的專案,需要實現較大檔案的傳輸。在網上收集了不少資料,但是各有各的做法,尤其是關於檔案自動接收這一塊不太清楚。 經過圖書館查閱後還是找到了一種解決辦法,雖然做的不太專業,但是思路比較精簡、清晰,也希望能給大家尤其是剛學習socket套接字的人

嵌入式開發板iTOP-4412實現TFTP檔案傳輸

平臺:iTOP-4412開發板 本文講解如何通過 TFTP 來實現線上除錯應用程式。 TFTP(Trivial File Transfer Protocol,簡單檔案傳輸協議) ,是一個基於 UDP 協議實現的用於在客戶機和伺服器之間進行簡單檔案傳輸的協議,適合於開銷不大、

FTP檔案傳輸協議兩種模式-主動模式和被動模式

TCP/IP協議中,FTP標準命令TCP埠號為21,Port方式資料埠為20。FTP協議的任務是從一臺計算機將檔案傳送到另一臺計算機,它與這兩臺計算機所處的位置、聯接的方式、甚至是是否使用相同的作業系統無關。假設兩臺計算機通過ftp協議對話,並且能訪問Internet, 你可以用ftp命令來傳輸檔案。每種作