用java实现ftp批量大文件上传下载(一) -凯发k8网页登录

posts - 310, comments - 6939, trackbacks - 0, articles - 3
  凯发k8网页登录-凯发天生赢家一触即发官网 :: 凯发k8网页登录首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

用java实现ftp批量大文件上传下载(一)

posted on 2007-10-22 09:37 诗特林 阅读(40941) 评论(37)     所属分类: socket
应该it168写的专稿.凯发k8网页登录的版权所有.http://tech.it168.com/j/2007-10-18/200710182058687.shtml

                                          用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

    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
    利用kudaa大文件传输工具
      kudaa大文件传输工具,可以进行离线大文件传输,是当今市场上进行大文件传送最快的软件。大家可以到kudaa网站 www.kudaa.net.cn下载kudaa进行快速互联网传输。该软件使用简单,传输效率高,已成为互联网大文件传输的标准选择。

    # ok  回复     

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

    # ok[未登录]  回复     

    2008-10-24 14:06 by
    试试!

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2008-11-29 23:45 by
    不知道楼主能不能看到...
    问下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
    很有用啊。

    # 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
    j-ftp 是开源的,但不能用于商业用途,否则需要向作者购买license。

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2010-04-04 14:46 by
    为何2次上传同一个文件的话,服务器生成的文件大小为0?
    发个源代码给我吧,谢谢!fjltry@gmail.com

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2010-11-13 08:53 by
    楼主,非常感谢,您写的文字,java大批量上传确实是个比较头痛的问题,因项目也要有此需求,能否发份源码。小弟感激不尽。
    邮箱:zhangmin032011@163.com

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2011-02-15 13:41 by
    楼主,因项目需求,现急需开发java大文件上传的功能,能否发份源码给我。不胜感激!!
    邮箱:etongs@163.com

    # re: 用java实现ftp批量大文件上传下载(一)[未登录]  回复     

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

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

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

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2011-03-31 10:42 by
    现在也正在做一个内网的批量大文件下载,找了很长时间但相关的资料都很少,能不能给我发一份源码,谢谢了!email:nana.lindali2004@gmail.com

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2011-05-16 13:11 by
    麻烦楼主发我一份源码,感激不尽 yongqi66@163.com

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2011-06-03 11:42 by
    楼主,因为项目需求,现急需开发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
    楼主您好,很高兴看到了基于java的文件上传下载,小弟正在做相应的功能,能劳烦大哥有时间的话将源代码发一份。先谢谢了。邮箱:zhangbo_youxiang@yeah.net

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2011-08-17 12:05 by
    楼主你好,因为项目需求,现急需开发java大文件上传的功能,能否发份源码给我。不胜感激!!
    邮箱:1052075@qq.com

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2011-09-29 09:22 by
    楼主你好,项目需求开发java大文件上传功能,劳烦大哥发份源码给我,谢谢。
    邮箱:happyboy1202@vip.qq.com

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2011-11-17 18:30 by
    不能上传以前传过的文件,不能传jar等特殊类型文件

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2012-04-09 16:15 by
    这个真的太好了,谢谢了,我正找呢

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2012-09-28 11:14 by
    如果可以的话,给我发一份,谢谢 fjjllzd@yeah.net

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2013-01-07 16:09 by
    博主你好,今天在网上看到您发的这篇文章,觉得很赞。我是新手,想学习下,能给我发一份吗。kingmax_zcp@163.com。o(∩_∩)o谢谢。

    # re: 用java实现ftp批量大文件上传下载(一)  回复     

    2013-08-20 09:40 by
    最近正好有这么一个需求,如果可以的话,麻烦给我发一份 谢谢 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
    正在学习这个,正好有这个需求,可以的话,麻烦发我一份
    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
    初学,希望给分源码,谢谢836735240@qq.com

    # re: 用java实现ftp批量大文件上传下载(一)[未登录]  回复     

    2014-10-10 11:08 by
    初学java,刚好看到这一部分,希望博主能发一份给我,非常感谢。847058219@qq.com

    只有注册用户后才能发表评论。


    网站导航:
                  
     
    网站地图