首页>>异常集锦>>使用apache-commons-net包ftp下载文件不能打开问题解决方法
使用apache-commons-net包ftp下载文件不能打开问题解决方法
来源: 时间: 2014-11-11 10:44:20

问题:通过struts2的stream返回类型返回由ftpclient从ftp服务器上取得的文件。文件类型可能是excel或者rar压缩包。在开发环境运行正常,但部署后,发现部分excel文件和全部的rar文件下载后都无法打开。
解决:
以某个不能打开的excel文件为例子,从windows下取得的文件大小是52115字节,从linux下取得的文件大小是52114字节,原始的文件是52115字节,linux下载的少了一个什么呢?
用Beyond Compare比较两个文件的十六进制。原始的文件(或通过windows下载的)有一处是“0D 0A”,而linux下载的是“   0A”。
比较Ascii值,可以判断是由于换行符引起的问题,windows是\r\n ,而linux下是\n 。
那么意味着ftpclient取得文件时做了换行符号的转换。

如何禁止ftp传输过程的换行符转换?查阅一下ftpclient的api,里面有个setFileType方法,与我们用ftp工具或者命令行方式设置ftp传输方式一致。
看一下ftpclient类的源码 :“__fileType = FTP.ASCII_FILE_TYPE;” 。默认的传输方式是ASCII,这样确实会由于换行符引起一些问题,比如在windows下编辑shell传到服务器就常常会收到“syntax error near unexpected token” 这样的问题,可以用dos2unix命令转换行,或者将编辑器如editplus的换行格式设为unix格式。

那么在ftpclient登录成功后,和开始下载文件前设置传输类型即可。

ftpclient.login(user, password);

ftpclient.setFileType(FTPClient.BINARY_FILE_TYPE);


上一篇: \\ip访问局域网内的计算机输入正确用户名和密码还是无法登录? 下一篇:Struts2 stream 返回异常 Connection reset by peer: socket write error