<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 310, comments - 6939, trackbacks - 0, articles - 3
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    用Java實現FTP批量大文件上傳下載(一)

    Posted on 2007-10-22 09:37 詩特林 閱讀(41149) 評論(37)  編輯  收藏 所屬分類: Socket
    應該IT168寫的專稿.版權所有.http://tech.it168.com/j/2007-10-18/200710182058687.shtml

                                              用Java實現FTP批量大文件上傳下載(一)

  • 用Java實現FTP批量大文件上傳下載(六)--代碼及示例下載
  • 用Java實現FTP批量大文件上傳下載(五) --運行效果圖
  • 用Java實現FTP批量大文件上傳下載(四)
  • 用Java實現FTP批量大文件上傳下載(三)
  • 用Java實現FTP批量大文件上傳下載(二)
  • 用Java實現FTP批量大文件上傳下載(一)

     

    本文介紹了在Java中,如何使用Java現有的可用的庫來編寫FTP客戶端代碼,并開發成Applet控件,做成基于Web的批量、大文件的上傳下載控件。文章在比較了一系列FTP客戶庫的基礎上,就其中一個比較通用且功能較強的j-ftp類庫,對一些比較常見的功能如進度條、斷點續傳、內外網的映射、在Applet中回調JavaScript函數等問題進行詳細的闡述及代碼實現,希望通過此文起到一個拋磚引玉的作用。

     

    一、        引子

     

    筆者在實施一個項目過程中出現了一種基于Web的文件上傳下載需求。在全省(或全國)各地的用戶,需要將一些文件上傳至某中心的文件服務器上。這些文件是用于一些大型的工程建設,可能涉及到上千萬甚至上億的建設工程。文件具有三個鮮明的特征:一是文件大,可能達到50M;二是文件數量多,有可能15個左右;三是數據安全性方面要求數字簽名及數據加密。

    首先考慮到是基于HTTP的傳輸方式。但筆者通過比較很快發現滿足上面的需求:

    1:用HTTP協議上傳,似乎更適合web編程的方便性;上傳小于1M文件速度要比用FTP協議上傳文件略快。但對于批量及大文件的傳輸可能無能為力。當然,它也有它的優勢,如不像FTP那樣,必須在服務器端啟動一個FTP服務。

    2:用FTP協議上傳文件大于1M的文件速度比HTTP快。文件越大,上傳的速度就比HTTP上傳的速度快數倍。而且用java編寫程序;FTPHTTP方便。

    筆者曾經使用VB也寫過ActiveX控件來進行批量文件的上傳下載,其功能也很強大。只是由于沒有對CAB文件或OCX進行專門的數字簽名,因此需要進行客戶端煩瑣的設置,如設置安全站點、降低客戶端的安全級別等等,因而放棄了些方案。

    同時考慮到在需在客戶端對文件進行數字簽名及數據加密,決定采用Applet的方式實現。。文件上傳之前,在客戶端可以獲取本地USBKEY密鑰信息,完成對上傳文件的加密和簽名處理。雖然采用Applet要求在客戶端安裝JRE運行時環境,給客戶端的管理及使用帶來一度的不方便性,但是相對起如此大量的文件及文件的安全性,這也許已經算是比較小的代價了。

    總結一下運行的環境為:

    FTP服務器端:Serv-U,專業的FTP服務器端程序,網上有現成的軟件下載,當然讀者也可能自己寫一個服務器端的FTP文件接收程序來進行解釋。如果沒有特殊要求或功能的話,Serv-U應該可以滿足我們一般上傳下載的需求了;

    客戶端:Java applet,當年讓Java大火了一把的號稱與微軟的ActiveX相提并論的技術當然,現在Java出了JavaFX,是不是Applet的替代品呢?

    應用環境:Internet網,最終目的。

     

    二、        Java FTP客戶端庫的選擇

     

    讓我們設想這樣一個情形--我們想寫一個純Java的從一個遠程計算機上運行的FTP服務器上傳下載文件的應用程序;我們還希望能夠得到那些供下載的遠程文件的基本文件信息,如文件名、數據或者文件大小等。

    盡管從頭開始寫一個FTP協議處理程序是可能的,并且也許很有趣,但這項工作也是困難、漫長并且存在著潛在的危險。因為我們不愿意親自花時間、精力、或者金錢去寫這樣的一個處理程序,所以我們轉而采用那些已經存在的可重用的組件。并且很多的庫存在于網上。

    找一個優秀的適合我們需要的Java FTP 客戶端庫并不像看起來那么簡單。相反這是一項非常痛苦復雜的工作。首先找到一個FTP客戶端庫需要一些時間,其次,在我們找到所有的存在的庫后,我們該選哪一個呢?每個庫都適合不同的需求。這些庫在性能上是不等價的,并且它們的設計上有著根本上的差別。每個類庫都各具特點并使用不同的術語來描述它們。因而,評價和比較FTP客戶端庫是一件困難的事情。

    使用可重用組件是一種值得提倡的方法,但是在這種情況下,剛開始往往是令人氣餒的。后來或許有點慚愧:在選擇了一個好的FTP庫后,其后的工作就非常簡單了,按簡單的規則來就行了。目前,已經有很多公開免費的ftp客戶端類庫,如simpleftpJ-ftp等,還有很多其他的ftpclient。如下表所示,表中未能全部列出,如讀者有更好的客戶端FTP類庫,請進行進一步的補充。

     

    FTP客戶端類庫名

    備注

    J-ftp

    J-ftp

    simpleftp

    HTTP://www.jibble.org/files/simpleftp.jar

    ftpclient

    com.enterprisedt.net.ftp.FTPClient

    FTPProtocol

    com.ibm.network.ftp.protocol.FTPProtocol

    FtpConnection 

    net.sf.jftp.net.FtpConnection

    FTPClient

    org.apache.commons.net.ftp.FTPClient

    FTPClient 

    jshop.jnet.FTPClient

    FtpClient 

    sun.net.ftp.FtpClient 

    FTP 

    com.cqs.ftp.FTP 

    Ftp

    cz.dhl.ftp.Ftp

    FTPClient

    org.globus.io.ftp.FTPClient

    在本文中,筆者采用是J-ftp。這個是個開源的且功能十分強大的客戶端FTP類庫。筆者很喜歡,同時也向各位讀者推薦一下。算了免費為它做一個廣告。

     

    三、        基本功能

     

    1、 登陸

    采用FTP進行文件傳輸,其實本質上還是采用Java.net.socket進行通信。以下代碼只是類net.sf.jftp.net.FtpConnection其中一個login方法。當然在下面的代碼,為了節省版面,以及將一些原理闡述清楚,筆者將一些沒必要的代碼去掉了,如日志等代碼。完整的代碼請參考J-ftp的源代碼或是筆者所以的示例源代碼,后面的代碼示例也同理:

    public int login(String username, String password)
        
    {
            
    this.username = username;
            
    this.password = password;

            
    int status = LOGIN_OK;

            jcon 
    = new JConnection(host, port);

            
    if(jcon.isThere())
            
    {
                in 
    = jcon.getReader();

                
    if(getLine(POSITIVE) == null)//FTP220_SERVICE_READY) == null)
                {
                    ok 
    = false;                
                    status 
    = OFFLINE;
                }
       

                
    if(!getLine(loginAck).startsWith(POSITIVE))//FTP230_LOGGED_IN))
                {               
                    
    if(success(POSITIVE))//FTP230_LOGGED_IN))
                    {                 
                    }

                    
    else
                    
    {
                        ok 
    = false;
                        status 
    = WRONG_LOGIN_DATA;
                    }

                }

            }

            
    else
            
    {
                
    if(msg)
                
    {
                    Log.debug(
    "FTP not available!");
                    ok 
    = false;
                    status 
    = GENERIC_FAILED;
                }

            }


            
    if(ok)
            
    {
                connected 
    = true;
                system();
                binary();
                
                String[] advSettings 
    = new String[6];

                
    if(getOsType().indexOf("OS/2">= 0)
                
    {
                    LIST_DEFAULT 
    = "LIST";
                }


                
    if(LIST.equals("default"))
                
    {
                    
    //just get the first item (somehow it knows first is the
                    
    //FTP list command)
                    advSettings = LoadSet.loadSet(Settings.adv_settings);

                    
    //*** IF FILE NOT FOUND, CREATE IT AND SET IT TO LIST_DEFAULT
                    if(advSettings == null)
                    
    {
                        LIST 
    = LIST_DEFAULT;

                        SaveSet s 
    = new SaveSet(Settings.adv_settings, LIST);
                    }

                    
    else
                    
    {
                        LIST 
    = advSettings[0];

                        
    if(LIST == null)
                        
    {
                            LIST 
    = LIST_DEFAULT;
                        }

                    }

                }


                
    if(getOsType().indexOf("MVS">= 0)
                
    {
                    LIST 
    = "LIST";
                }


                
    //***
                fireDirectoryUpdate(this);
                fireConnectionInitialized(
    this);
            }

            
    else
            
    {
                fireConnectionFailed(
    thisnew Integer(status).toString());
            }


            
    return status;
        }

    此登陸方法中,有一個JConnection類,此類負責建立socket套接字    ,同時,此類是一種單獨的線程,這樣的好處是為了配合界面的變化,而將網絡的套接字連接等工作做為單獨的線程來處理,有利于界面的友好性。下面是net.sf.jftp.net.JConnection類的run方法,當然,此線程的啟動是在JConnection類的構造方法中啟動的。
        
    public void run()
        
    {
            
    try
            
    {
                s 
    = new Socket(host, port);

                localPort 
    = s.getLocalPort();

                
    //if(time > 0) s.setSoTimeout(time);
                out = new PrintStream(new BufferedOutputStream(s.getOutputStream(),
                                                               Settings.bufferSize));
                in 
    = new BufferedReader(new InputStreamReader(s.getInputStream()),
                                        Settings.bufferSize);
                isOk 
    = true;

                
    // }
            }

            
    catch(Exception ex)
            
    {
                ex.printStackTrace();
                Log.out(
    "WARNING: connection closed due to exception (" + host +
                        
    ":" + port + ")");
                isOk 
    = false;

                
    try
                
    {
                    
    if((s != null&& !s.isClosed())
                    
    {
                        s.close();
                    }


                    
    if(out != null)
                    
    {
                        out.close();
                    }


                    
    if(in != null)
                    
    {
                        in.close();
                    }

                }

                
    catch(Exception ex2)
                
    {
                    ex2.printStackTrace();
                    Log.out(
    "WARNING: got more errors trying to close socket and streams");
                }

            }


            established 
    = true;
        }

     

    run方法中的socket這里說明一下,此類實現客戶端套接字(也可以就叫“套接字”),套接字是兩臺機器之間的通信端點。套接字的實際工作由 SocketImpl 類的實例執行。應用程序通過更改創建套接字實現的套接字工廠可以配置它自身,以創建適合本地防火墻的套接字。具體的說明請參考JDK5 API說明,最好是中文的。呵呵。




    未完待續,下篇寫上傳下載及進度條.....

  • 評論

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2007-12-21 16:26 by zhong
    利用Kudaa大文件傳輸工具
      Kudaa大文件傳輸工具,可以進行離線大文件傳輸,是當今市場上進行大文件傳送最快的軟件。大家可以到Kudaa網站 www.kudaa.net.cn下載Kudaa進行快速互聯網傳輸。該軟件使用簡單,傳輸效率高,已成為互聯網大文件傳輸的標準選擇。

    # OK  回復  更多評論   

    2007-12-26 16:33 by KK
    我就用Kudaa,越用越好用!

    # ok[未登錄]  回復  更多評論   

    2008-10-24 14:06 by test
    試試!

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2008-11-29 23:45 by invitesun
    不知道樓主能不能看到...
    問下import net.sf.jftp.util.FileAttribute;
    import net.sf.jftp.util.GetSysTempPath;
    import net.sf.jftp.util.GetSysTempPath;
    這幾個是那個包里的?還是什么

    再一個:源碼里哪幾個是你們寫的文件。我找不到有上面那幾個導入文件的包。

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2009-04-23 20:36 by ktrsk
    很有用啊。

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2009-05-11 01:21 by 趙夕坤
    樓主你好,有幸看到基于java的文件傳輸,可否將源代碼發一下,先謝謝了;
    郵箱:
    meccashrine@163.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2009-05-11 01:21 by 趙夕坤
    樓主你好,有幸看到基于java的文件傳輸,有時間的話可否將源代碼發一下,先謝謝了。
    郵箱:
    meccashrine@163.com

    # re: 用Java實現FTP批量大文件上傳下載(一)[未登錄]  回復  更多評論   

    2009-12-08 14:23 by 小蝦米
    怎么就是沒有 j-ftp的下載地址啊。。。筆者給提供一個啥。

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2010-03-17 11:01 by try
    J-Ftp 是開源的,但不能用于商業用途,否則需要向作者購買License。

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2010-04-04 14:46 by fjltry
    為何2次上傳同一個文件的話,服務器生成的文件大小為0?
    發個源代碼給我吧,謝謝!fjltry@gmail.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2010-11-13 08:53 by zhangmin
    樓主,非常感謝,您寫的文字,java大批量上傳確實是個比較頭痛的問題,因項目也要有此需求,能否發份源碼。小弟感激不盡。
    郵箱:zhangmin032011@163.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2011-02-15 13:41 by stanley
    樓主,因項目需求,現急需開發java大文件上傳的功能,能否發份源碼給我。不勝感激!!
    郵箱:etongs@163.com

    # re: 用Java實現FTP批量大文件上傳下載(一)[未登錄]  回復  更多評論   

    2011-02-22 16:54 by zhou
    非常感謝你,我希望你可以被我一份源碼 ,不勝感激。
    zhouziqin@126.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2011-03-01 11:10 by
    非常感謝你,我希望你可以被我一份源碼 ,不勝感激。
    21728324@qq.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2011-03-31 10:42 by lindali
    現在也正在做一個內網的批量大文件下載,找了很長時間但相關的資料都很少,能不能給我發一份源碼,謝謝了!Email:nana.lindali2004@gmail.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2011-05-16 13:11 by spring_zyq
    麻煩樓主發我一份源碼,感激不盡 yongqi66@163.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2011-06-03 11:42 by gomyhome
    樓主,因為項目需求,現急需開發java大文件上傳的功能,能否發份源碼給我。不勝感激!!
    郵箱:629215660@qq.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2011-07-18 09:00 by 劉珂
    樓主你好,有幸看到基于java的文件傳輸,有時間的話可否將源代碼發一下,先謝謝了。
    郵箱:
    464609071@qq.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2011-07-19 09:28 by 何楊
    好。

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2011-08-09 10:50 by zhangbo
    樓主您好,很高興看到了基于java的文件上傳下載,小弟正在做相應的功能,能勞煩大哥有時間的話將源代碼發一份。先謝謝了。郵箱:zhangbo_youxiang@yeah.net

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2011-08-17 12:05 by yuer
    樓主你好,因為項目需求,現急需開發java大文件上傳的功能,能否發份源碼給我。不勝感激!!
    郵箱:1052075@qq.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2011-09-29 09:22 by batuhe
    樓主你好,項目需求開發java大文件上傳功能,勞煩大哥發份源碼給我,謝謝。
    郵箱:happyboy1202@vip.qq.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2011-11-17 18:30 by boywamg
    不能上傳以前傳過的文件,不能傳jar等特殊類型文件

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2012-04-09 16:15 by itbaiso
    這個真的太好了,謝謝了,我正找呢

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2012-09-28 11:14 by fjjllzd
    如果可以的話,給我發一份,謝謝 fjjllzd@yeah.net

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2013-01-07 16:09 by 蒙奇D幽幽
    博主你好,今天在網上看到您發的這篇文章,覺得很贊。我是新手,想學習下,能給我發一份嗎。kingmax_zcp@163.com。O(∩_∩)O謝謝。

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2013-08-20 09:40 by zhangxf
    最近正好有這么一個需求,如果可以的話,麻煩給我發一份 謝謝 zh_ka@163.com

    # re: 用Java實現FTP批量大文件上傳下載(一)[未登錄]  回復  更多評論   

    2013-09-30 09:24 by 小白
    718589908@qq.com 等待中……

    # re: 用Java實現FTP批量大文件上傳下載(一)[未登錄]  回復  更多評論   

    2013-11-11 22:25 by 菜鳥
    1875474093@qq.com
    最近正好有這么一個需求,如果可以的話,麻煩給我發一份 謝謝

    # re: 用Java實現FTP批量大文件上傳下載(一)[未登錄]  回復  更多評論   

    2013-11-27 11:22 by 菜鳥
    出現
    > Got IOException while trying to open a socket!
    java.net.SocketTimeoutException: Accept timed out
    錯誤異常 求幫忙
    zw9010@sina.cn 等待中……

    # re: 用Java實現FTP批量大文件上傳下載(一)[未登錄]  回復  更多評論   

    2014-01-07 13:42 by Java新手
    正在學習這個,正好有這個需求,可以的話,麻煩發我一份
    hx082011@163.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2014-02-22 00:19 by
    人人人人

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2014-02-28 08:41 by 哥倆好
    博主你好,今天在網上看到您發的這篇文章,覺得很好。小弟正在學習JAVA,如果可以的化,發一份給我,851341178@qq.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2014-03-17 22:17 by 龍天
    你好!我正在寫一個類似的功能!能給我發一份嗎!wangzilongtian@126.com謝謝了!

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2014-03-19 14:22 by 葉狒
    正在學習java,對這個功能很感興趣,希望博主 能發一份,不勝感激。1021575030@qq.com

    # re: 用Java實現FTP批量大文件上傳下載(一)  回復  更多評論   

    2014-06-03 22:25 by lv
    初學,希望給分源碼,謝謝836735240@qq.com

    # re: 用Java實現FTP批量大文件上傳下載(一)[未登錄]  回復  更多評論   

    2014-10-10 11:08 by apple
    初學java,剛好看到這一部分,希望博主能發一份給我,非常感謝。847058219@qq.com
    主站蜘蛛池模板: 免费视频爱爱太爽了| 13小箩利洗澡无码视频网站免费| 18禁美女黄网站色大片免费观看 | 亚洲黄色三级网站| 全部免费毛片在线播放| 国产A在亚洲线播放| 国产免费阿v精品视频网址| 亚洲AV中文无码字幕色三| 国产精品免费AV片在线观看| 久久精品国产96精品亚洲| 四虎国产精品永久免费网址 | 国产99视频精品免费专区| 亚洲av无码专区在线播放| 久久aⅴ免费观看| 亚洲精品在线免费看| 美女视频黄的全免费视频网站| 久久久久久亚洲精品影院| 国产成人免费永久播放视频平台| 国产精品亚洲а∨无码播放不卡| AV在线亚洲男人的天堂| 黄色网站软件app在线观看免费| 亚洲AV人无码激艳猛片| 91在线品视觉盛宴免费| 亚洲av无码兔费综合| 亚洲精品国产自在久久| 久久国产免费一区二区三区| 亚洲国产品综合人成综合网站 | 亚洲午夜激情视频| 国产成人免费视频| 亚洲风情亚Aⅴ在线发布| 国产亚洲欧洲Aⅴ综合一区 | 今天免费中文字幕视频| 亚洲沟沟美女亚洲沟沟| 国产伦精品一区二区三区免费下载 | caoporm碰最新免费公开视频| 国产精品亚洲成在人线| 久久久高清免费视频| 五月婷婷免费视频| 亚洲国产成人精品无码区在线秒播| 国产最新凸凹视频免费| 免费国产成人18在线观看|