使用Apache Commons Net API实现FTP上传下载过程中的坑点

最近项目需要实现FTP上传、下载功能,采用了Apache Commons Net API。代码很快就完成了,但由于对相关API使用场景不是很熟悉,走了一些弯路,抽一点时间做一下总结。

A)主动被动模式选择:FTP主动模式和被动模式的详细介绍可以参考(http://blog.csdn.net/huanggang028/article/details/41248663)。大概意思就是主动模式是客户端向服务端发送PORT命令,然后服务端通过20数据端口连接客户端开启的端口,然后发送数据;被动模式是客户端向服务端发送PASV命令,服务端随机开启一个端口并通知客户端,客户端根据该端口与服务端建立连接,然后发送数据。服务端是两种模式的,使用哪种模式取决于客户端,同时关键点在于网络环境适合用哪种模式,比如客户端在防火墙内,则最好选择被动模式。ftpClient.enterLocalActiveMode()便是配置成主动模式,而ftpClient.enterLocalPassiveMode()则配置成被动模式。

B)文件格式选择:默认是类型是ASCII(普通文本文件),但是为了使得支持任何类型,建议设置成BINARY_FILE_TYPE,并且是在上传和下载操作开始前调用setFileType(int fileType)。

C)上传、下载重载方法的使用选择:比如上传,boolean storeFile(String remote, InputStream local)和OutputStream storeFileStream(String remote),差别是第一个方法如果我们不用关心到底已经从InputStream中传递了多少字节,完全依靠接口内部实现完成输入输出操作,而第二个方法使得我们可以在上传过程中控制传送字节速度等额外操作,比如传送进度的实现便可以依赖此方法。但是,需要注意的是,如果采用了第二个方法来做, 必须靠我们去实现是否上传完毕、下载完毕的事后控制,否则会出现问题。比如我们采用第二个方法,需要手动关闭流,同时,紧接着调用completePendingCommand()方法。如果使用第一个方法不能调用completePendingCommand()方法,因为它一旦被调用, 会一直等待FTP服务器返回226Transfer complete,但是FTP服务器只有在接受流执行close方法时,才会返回。不该调用的时候调用了便会出现僵死现象,同时报错:

<span style="font-size:18px;">    14/11/19 13:43:29 ERROR expand.FTPSupport: FTP response 421 received.  Server closed connection.
org.apache.commons.net.ftp.FTPConnectionClosedException: FTP response 421 received.  Server closed connection.
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:363)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:290)
at org.apache.commons.net.ftp.FTP.getReply(FTP.java:637)
at org.apache.commons.net.ftp.FTPClient.completePendingCommand(FTPClient.java:1637)</span>
时间: 2024-11-04 10:21:10

使用Apache Commons Net API实现FTP上传下载过程中的坑点的相关文章

文件上传下载过程中中文名称问题

//上传-- // 1 保存数据到excel,对应的sheet头header,body数据类型list //2 上传文件到服务器中 //下载-- // 1 获取文件路径 //2 导出数据到保持的路径(或者是浏览器路径) /** * 保存数据到excel * @param listBody * @param sheetName */ public void saveExcelData(List<DocLibBrowseOrgVo> listBody, String sheetName) { XS

使用cmd命令行方式登录ftp上传下载数据

部分用户在使用ftp工具登录空间上传下载过程中经常会遇到各种问题,如主动模式,被动模式,以及其他导致无法登陆ftp .上传数据.下载数据的问题,这时候不妨使用一下命令行方式.命令行下可以避免很多由于ftp工具配置导致的问题,而且这种方式下下载数据的速率明显比使用ftp工具更快.下面就来看一下如何使用ftp 命令进行简单的上传下载数据.1.登录ftp在“开始”->”运行”中输入“cmd”,进入cmd命令行模式,接下来输入:ftp 118.193.22.151输入自己的网站ip地址,接下来会提示输入

简单的FTP上传下载(java实现)

/** *阅读前请自己在win7上建立FTP主机 *具体步骤如:http://jingyan.baidu.com/article/574c5219d466c36c8d9dc138.html * 然后将以下FTP,username,password分别改成你的FTP ip地址 用户名 密码即可 * 本例子用了apche的commons-net-3.3.jar以方便FTP的访问 请手动buid -path * 待完成版 刷新按钮 登录 都还没有做 而且上传 下载 完成后都需要重新运行 * 2014-

FTP 上传下载工具类

import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketException; import o

java ftp 上传下载工具类

1 package com.mohecun.utils; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.OutputStre

高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)

前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上传下载. 这两种感觉都有利弊. 第一种实现了代码复用,但是配置信息全需要写在类中,维护比较复杂. 第二种如果是spring框架,可以通过propertis文件,动态的注入配置信息,但是又不能代码复用. 所以我打算自己实现一个工具类,来把上面的两种优点进行整合.顺便把一些上传过程中一些常见的问题也给解

python之实现ftp上传下载代码(含错误处理)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kaituorensheng/p/4480512.html#_label2 import ftplib import socket import os def ftpconnect(ftp_info): try: ftp = ftplib.FTP(ftp_info[0]) except (socket.er

python之模块ftplib(实现ftp上传下载代码)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(实现ftp上传下载代码) #需求:实现ftp上传下载代码(不含错误处理) from ftplib import FTP def ftpconnect(): ftp_server='ftp.python.org' ftp=FTP() ftp.set_debuglevel(2)#打开调式级别2 ftp.connect(ftp_server,21) ftp.login('',''

python网络编程socket模块实现ftp上传下载

本实验实现ftp上传文件下载文件功能,并具有校验文件完整性,打印进度条功能, 主要练习socket,struct模块. ftp用户文件存放在user.json文件中 user.json文件内容 {"lisi": "abcdef", "hyh": "123456"} ftp客户端脚本ftpclient.py #!/usr/bin/python # --*-- coding: utf-8 --*-- import socket i