`
zhaixf2001
  • 浏览: 25352 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

定时上传FTP文件

阅读更多
这两天搞了一个定时上传FTP文件的小功能模块。
其中FTP上传下载用的是apache的org.apache.commons.net包中的FTPClient类实现的;这个东西用起来还是相当方便的。
下面是apach自带的FTPExample的类,现在把源代码贴出来,供大家参考:
/***略掉了包和import的说明部分***/
043    public final class FTPExample
044    {
045    
046        public static final String USAGE =
047            "Usage: ftp [-s] [-b] <hostname> <username> <password> <remote file> <local file>\n" +
048            "\nDefault behavior is to download a file and use ASCII transfer mode.\n" +
049            "\t-s store file on server (upload)\n" +
050            "\t-b use binary transfer mode\n";
051    
052        public static final void main(String[] args)
053        {
054            int base = 0;
055            boolean storeFile = false, binaryTransfer = false, error = false;
056            String server, username, password, remote, local;
057            FTPClient ftp;
058    
059            for (base = 0; base < args.length; base++)
060            {
061                if (args[base].startsWith("-s"))
062                    storeFile = true;
063                else if (args[base].startsWith("-b"))
064                    binaryTransfer = true;
065                else
066                    break;
067            }
068    
069            if ((args.length - base) != 5)
070            {
071                System.err.println(USAGE);
072                System.exit(1);
073            }
074    
075            server = args[base++];
076            username = args[base++];
077            password = args[base++];
078            remote = args[base++];
079            local = args[base];
080    
081            ftp = new FTPClient();
082            ftp.addProtocolCommandListener(new PrintCommandListener(
083                                               new PrintWriter(System.out)));
084    
085            try
086            {
087                int reply;
088                ftp.connect(server);
089                System.out.println("Connected to " + server + ".");
090    
091                // After connection attempt, you should check the reply code to verify
092                // success.
093                reply = ftp.getReplyCode();
094    
095                if (!FTPReply.isPositiveCompletion(reply))
096                {
097                    ftp.disconnect();
098                    System.err.println("FTP server refused connection.");
099                    System.exit(1);
100                }
101            }
102            catch (IOException e)
103            {
104                if (ftp.isConnected())
105                {
106                    try
107                    {
108                        ftp.disconnect();
109                    }
110                    catch (IOException f)
111                    {
112                        // do nothing
113                    }
114                }
115                System.err.println("Could not connect to server.");
116                e.printStackTrace();
117                System.exit(1);
118            }
119    
120    __main:
121            try
122            {
123                if (!ftp.login(username, password))
124                {
125                    ftp.logout();
126                    error = true;
127                    break __main;
128                }
129    
130                System.out.println("Remote system is " + ftp.getSystemName());
131    
132                if (binaryTransfer)
133                    ftp.setFileType(FTP.BINARY_FILE_TYPE);
134    
135              // Use passive mode as default because most of us are
136                // behind firewalls these days.
137                ftp.enterLocalPassiveMode();
138    
139                if (storeFile)
140                {
141                    InputStream input;
142    
143                    input = new FileInputStream(local);
144    
145                    ftp.storeFile(remote, input);
146    
147                    input.close();
148                }
149                else
150                {
151                    OutputStream output;
152    
153                    output = new FileOutputStream(local);
154    
155                    ftp.retrieveFile(remote, output);
156    
157                    output.close();
158                }
159    
160                ftp.logout();
161            }
162            catch (FTPConnectionClosedException e)
163            {
164                error = true;
165                System.err.println("Server closed connection.");
166                e.printStackTrace();
167            }
168            catch (IOException e)
169            {
170                error = true;
171                e.printStackTrace();
172            }
173            finally
174            {
175                if (ftp.isConnected())
176                {
177                    try
178                    {
179                        ftp.disconnect();
180                    }
181                    catch (IOException f)
182                    {
183                        // do nothing
184                    }
185                }
186            }
187    
188            System.exit(error ? 1 : 0);
189        } // end main
190    
191    }

中间遇见的问题:
代码中第137行ftp.enterLocalPassiveMode();
在api中的解释为:
Set the current data connection mode to PASSIVE_LOCAL_DATA_CONNECTION_MODE . Use this method only for data transfers between the client and server. This method causes a PASV command to be issued to the server before the opening of every data connection, telling the server to open a data port to which the client will connect to conduct data transfers. The FTPClient will stay in PASSIVE_LOCAL_DATA_CONNECTION_MODE until the mode is changed by calling some other method such as enterLocalActiveMode()。

我在上传下载文件的过程中就是少了这么一句,查问题花了不少功夫。
问题的症状:上传的文件在FTP服务器上生成了,但是没有内容;再看程序卡在ftp.storeFile(remote, input);不走了,也不报异常(个人认为apache这里搞的不好,多少提示一下吗,一点反应都没有)。
经过:最初我没有加第137行这句,然后在本机启了一个FTP服务,上传下载都OK。再在内网的一个测试机上测试,也OK。放到正式环境上,就出现了我上面说的症状。到现在我也没明白为什么。希望能有高人指点迷津。

然后我查了api相关的几个方法enterLocalActiveMode,enterRemoteActiveMode,enterRemotePassiveMode。
我的理解大概是这样的
enterLocalPassiveMode:设置客户端PASV模式
static int PASSIVE_LOCAL_DATA_CONNECTION_MODE
enterLocalActiveMode:设置客户端PORT模式
static int ACTIVE_LOCAL_DATA_CONNECTION_MODE
enterRemoteActiveMode:server to server
static int ACTIVE_REMOTE_DATA_CONNECTION_MODE
requiring the one(client) connect to the other server's data port to initiate a data transfer.
enterRemotePassiveMode:server to server
static int PASSIVE_REMOTE_DATA_CONNECTION_MODE
requiring the other server to connect to the first server's data port to initiate a data transfer

对FTP协议了解的不太清楚是一个很大的原因,有时间要看看FTP协议的内容了。

查了一些资料:
FTP传输有两种模式:主动模式(PORT)和被动模式(PASV)
主动模式:客户端主动连服务器端;端口用20
被动模式:服务器端连客户端;随机打开一个高端端口(端口号大于1024)

小提示:有防火墙用户不能使用主动模式,这是因为防火墙不允许来自网外的主动连接,所以用户必须同使用被动模式。

到这里上面遇到的问题也就比较清晰了。

http://www.xiaojb.com/archives/it/ftp.shtml
这个链接有一个比较完整的FTP交互流程,简单易懂
分享到:
评论
2 楼 godandghost 2013-07-17  
博主,我遇到了和你一样的问题:上传的文件在FTP服务器上生成了,但是大小是0K,也不报错。我用的是主动模式,以你的经验改成被动模式是不是就能好了?
1 楼 a175460677 2009-01-23  
问以下 为什么我只能在本机上上传,在别人的电脑上就不行呢,内网的都不行

错误如下:文件名后面的(????是什么)
java.io.FileNotFoundException: E:\upload-zf\yy_math.flv (???????????)
java.io.FileInputStream.open(Native Method)
java.io.FileInputStream.<init>(FileInputStream.java:106)
java.io.FileInputStream.<init>(FileInputStream.java:66)
cn.js.fan.util.FTPUtil.storeFile(FTPUtil.java:85)
com.servlet.FtpUpload.doGet(FtpUpload.java:107)
com.servlet.FtpUpload.doPost(FtpUpload.java:126)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.10 logs.

相关推荐

    定时ftp上传文件

    要定时上传日志,我们需要知道日志文件的存储位置,并确保在每次上传时选取的是最新生成的日志文件。 然后,是“服务端配置好的FTP服务”。要提供FTP服务,服务器端需要安装并配置FTP服务器软件,如vsftpd(在Linux...

    ftp定时上传下载文件

    在某些业务场景中,自动化的FTP定时上传和下载文件功能显得尤为重要,例如备份、同步数据或发布更新等。下面我们将详细探讨如何实现这一功能。 首先,FTP定时上传下载通常涉及到以下几个关键技术点: 1. FTP客户端...

    ftp文件定时传输,适合远程文件备份

    FTP文件定时传输是一种常见的远程数据备份策略,尤其适用于数据库等关键数据的安全管理。在这个场景下,用户提到的需求是实现一个自定义程序,该程序能够自动检测本地文件的变化,并在有新文件或文件更新时通过FTP...

    ftp 定时上传代码

    本主题聚焦于如何在Delphi6环境下利用RZ控件实现FTP的定时上传功能。Delphi是一款强大的Windows应用程序开发工具,而RZ控件集是其中广泛使用的第三方组件,提供了丰富的功能,包括FTP客户端功能。 首先,我们需要...

    java + sybase 定时ftp文件上传

    在IT行业中,集成不同的技术以实现自动化流程是常见的需求,比如本例中的“java + sybase 定时ftp文件上传”。这个场景涉及到Java编程、Sybase数据库管理和FTP文件传输等核心知识点,接下来我们将深入探讨这些内容。...

    java定时从ftp服务器更新相关文件

    Java定时从FTP服务器更新相关文件是一项常见的任务,特别是在自动化数据同步和备份的场景中。这里主要涉及的技术点包括FTP协议、Java编程以及文件系统操作。...结合定时任务框架,可以构建一个完整的FTP文件更新系统。

    Java编写的linux下定时通过ftp上传文件

    首先,我们需要了解Java中用于FTP操作的库,如`commons-net`,它提供了`FTPClient`类,便于我们进行FTP文件传输。在Linux系统中,我们可以使用Java的`java.util.Timer`和`java.util.TimerTask`来设定定时任务。下面...

    可自动更新,定时启动FTP自动上传日志文件

    该脚本用于产生日志文件,并上传到指定FTP服务器上查询使用。 自动检查FTP服务器是否ping通,如果ping不通则脚本不运行。 自动加入启动项,自动制定计划任务,定时运行。 可在脚本内指定时间段内不运行。 根据设置...

    java写的ftp下载上传定时监控

    总之,Java提供了强大的工具来实现FTP文件传输、定时监控以及文件的压缩与解压功能。通过结合使用如Apache Commons Net和Apache Commons Compress等库,开发者可以构建出高效、稳定的文件管理解决方案。在设计这样的...

    springboot以FTP方式上传文件到远程服务器的流程

    Spring Boot 中使用 FTP 上传文件到远程服务器的流程 在本文中,我们将介绍如何使用 Spring Boot 实现 FTP 上传文件到远程服务器的流程。这个流程包括如何使用 JWT 登录认证及鉴权的流程,以及如何使用 Spring ...

    vbs自动上传ftp

    - 实现定时上传任务,结合Windows任务计划程序,可以定期自动上传指定文件。 - 增加日志记录功能,记录每次上传的详细情况,便于后续追踪问题。 - 支持多线程上传,提高大文件的上传效率。 - 添加文件完整性校验功能...

    quartz定时任务,文件ftp上传、下载、md5加解密、

    "quartz定时任务,文件ftp上传、下载、md5加解密"这个项目,就是针对这一需求的一个实例,它利用了Quartz库来创建后台定时任务,实现了文件通过FTP进行传输以及MD5加解密的功能。本文将详细讲解这些知识点。 首先,...

    Linux+ftp+自动上传备份文件脚本

    本文主要涉及如何在Linux环境下使用FTP自动上传备份文件,并实现定期备份和清理策略。以下是详细的知识点解析: 1. **RMAN备份**: RMAN(Recovery Manager)是Oracle数据库的备份和恢复工具,它可以创建数据库、...

    实现ftp文件分割,加密解密上传文件

    由于自己最近项目做到大文件传输,最大支持5个G的文件传输,并且每天定时传输文件,基于此需求自己开发的一个完整项目,现在分享给需要的朋友。支持定时传输,文件分割合并,断点续传,aes加密解密,md5文件校验完整...

    怎样用asp调用ftp命令实现文件上传

    在ASP(Active Server Pages)中调用FTP命令来实现文件上传主要是为了处理大文件和大量文件的场景,因为传统的File System Object (FSO)方法在处理大文件时可能会遇到性能和资源消耗的问题,特别是当上传涉及到...

    java编写ftp定时上传下载

    综上所述,"java编写ftp定时上传下载" 这一主题涵盖了Java编程、网络文件传输、定时任务调度、配置文件读取等多个方面,通过合理地组合这些技术,可以实现自动化的FTP文件管理和同步,大大提高了工作效率。...

    定时导出Oracle数据库数据并上传到FTP目录脚本

    总的来说,这个任务涉及了Oracle数据库的查询操作、批处理脚本的编写以及FTP文件传输,是IT运维工作中常见的自动化流程。理解并掌握这些技能,能够大大提高工作效率,减少手动操作带来的风险和错误。

    oracle 定时exp文件到ftp服务器(soaris)

    Oracle 定时 EXP 文件到 FTP 服务器(Solaris) 一、Oracle 数据备份概述 在企业中的数据库管理中,数据备份是非常重要的一步骤。 Oracle 数据库作为一个强大的关系数据库管理系统,它提供了多种方式来备份数据。...

    FTP批处理-自动压缩上个月的文件并上传

    本批处理能实现自动压缩上个月的文件并上传

    源程序_定时_PB6.5FTP上传源码_

    “用于简单配置FTP参数后自动定时上传文件使用”这部分说明了程序的使用方式。用户需要配置FTP服务器的相关信息,如地址、端口、用户名和密码,然后设定定时规则,比如每小时、每天或每周上传一次。这种定时任务的...

Global site tag (gtag.js) - Google Analytics