【开发心得】Java ftp开发注意事项
创始人
2024-04-09 15:29:17
0

前言:

    虽说已经2022年了,但是ftp上传方式还是有一定使用场景的,关于java的ftp上传下载实现,基本都指向了apache commont net 库。

代码实现可以参考:
https://blog.csdn.net/tianshan2010/article/details/103690940

或者其他类似的文章,基础使用大同小异,本文重点讨论可能遇到的坑。

1. completePendingCommand 造成的坑

注意,如果断点上传可以使用 storeFileStream

public boolean storeFile(String remote, InputStream local)
public OutputStream storeFileStream(String remote)

注意,先outputStream close之后才能调用 completePendingCommand,否则会卡住,有文章说,如果上传路径没有权限,无法创建output对象,也有可能卡住,需要注意下。

断点下载可以使用 retrieveFileStream

public boolean retrieveFile(String remote, OutputStream local)
public InputStream retrieveFileStream(String remote)

注意,先inputStream close之后才能调用 completePendingCommand,否则会卡住

除了先关闭之外,一定要确定远程文件存在且能访问,否则inputStream为null,无法调用close,就会卡住。

FTPClient中使用completePendingCommand方法注意事项 - 爱码网方法介绍: * There are a few FTPClient methods that do not complete the * entire sequence of FTP commands to complete a transaction. These * commands require some action by the programmer aftehttps://www.likecs.com/show-305874415.html

2. 如何终止 ftp上传或者下载?

博主实践的逻辑是,使用断点续传的两组方法,外部传递listener 抽象接口,监听stop时机,在流拷贝的时候,关闭输入输出流,并使用ftpclient.abort()方法。

注意,ftpclient.abort() 要在传输结束的时候才会执行,所以要先close 底层实际上发送的是abor命令,可以断点看看。

3.  中文名称无法下载或者上传出现中文乱码?

核心原因是字符集问题,ftp默认传输使用的字符集是iso-8859-1,需要设置下字符集。

注意,一定不要直接设置 直接设置如下,GBK或者UTF-8,需要根据你的ftpserver来,或者干脆去做下推测。

错误示范:

ftpClient.appendFileStream(new String(remoteFullPath.getBytes("GBK"), "iso-8859-1"));

正确示范:

  private Boolean getEncodingUtf8(FTPClient ftpClient) {Boolean result = false;try {if (ftpClient != null) {if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {result = true;}}} catch (Exception e) {log.error(e.getMessage(), e);}return result;}

 通过执行上述方法获取到encoding,并且getBytes即可,上传下载都一样。

4. 文件大小下载或者上传不一致。

ftpClient.login(username, password);             ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 

注意,一定要在login之后在设置FileType,否则会不生效。

原因如下:

FTP的传输有两种方式: ASCII传输模式和二进制数据传输模式。**1.ASCII传输方式:**假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝,不要对这些文件进行处理,这也是下面要讲的二进制传输。2.二进制传输模式: 在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会使传输稍微变慢 ,也会损坏数据,使文件变得不能用。(在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果你传输二进制文件,所有的位都是重要的。)

5.  如果使用连接池(apache pool2) 一定记得归还,并且设置超时配置。

setMaxWaitMillis 最大租用超时时间。这个也可以避免使用池化技术的时候,问题1

相关内容

热门资讯

盘州市南湖社区:打造法律“服务... 近年来,为破解基层法律服务“最后一公里”难题,推进社区矛盾纠纷法治化实质性化解,贵州省盘州市以“精准...
内乡法院:彩礼纠纷引诉讼 法院... 大象新闻记者 魏广宝 通讯员 聂传青 张航/文图 近日, 内乡县人民法院灌涨法庭成功调解一起因婚姻关...
税费服务“主动敲门” 政策红利... “税务部门的主动提醒和精准辅导真是太及时了,不仅帮我们规避了因政策理解偏差可能引发的风险,更让我们实...
民政部:会同有关部门建立最低生... 据新华社,记者12月30日在全国民政工作会议上获悉,民政部将会同有关部门建立最低生活保障标准备案制度...
肯尼亚投资:税务及法律合规指引 一、肯尼亚的外国直接投资 肯尼亚无疑是非洲吸引外国直接投资(FDI)最多的国家之一。根据《2025年...
大同多部门联动打击生态环境违法... 本报讯(通讯员刘美 陈俊宏)近日,大同市中级人民法院联合大同市人民检察院、大同市公安局、大同市司法局...
南阳宛城检察:让道争执酿祸端 ... 大象新闻记者 张定有 通讯员 魏颖 张婷/文图 一桩因乡间小道通行引发的争执,险些酿成极端事件。南阳...
寻找靠谱征地律师,孙侠律师 在征地相关法律事务中,找到一位靠谱且成功率高的征地律师至关重要。随着城市化进程的加速,征地纠纷日益增...
民政部:会同有关部门建立最低生... 记者12月30日在全国民政工作会议上获悉,民政部将会同有关部门建立最低生活保障标准备案制度,从制度上...