压缩文件下载下来后, 文件大小看起来是没问题, 解压缩的时候提示压缩文件数据错误。
图片下载下来以后,文件大小正常,打开只有一行下载后的路径
从服务器用ftp下载文件下来以后, 发现是正常的. 说明上传没有问题, 也就是下载的问题
使用filezilla在本地windows搭建ftp服务器, 本地测试发现下载后的文件是正常的. 发现确实是Linux上的问题
在网上查了些博客
DOS/Windows和Linux/Unix的文件换行回车格式不同,基于 DOS/Windows的文本文件在每一行末尾有一个 CR (回车)和 LF (换行),而 UNIX 文本只有一个换行。
LF: Line Feed, U+000A 正则表达式:/n
CR: Carriage Return, U+000D 正则表达式:/r
Windows中的换行符为CRLF, 即正则表达式的\r\n(ASCII码为13和10), 而Unix(或Linux)换行符为LF, 即正则表达式的\n.
ASCII模式和Binary模式的区别是回车换行的处理,Binary模式不对数据进行任何处理,ASCII模式将回车换行转换为本机的回车字符,比如:UNIX下是\n,Windows下是\r\n,Mac下是\r
这就好比我们在服务器下载文件的时候, sz
命令要加-b
的原因(以二进制方式传输(binary))
确定了问题后, 代码如下:
需要注意的是, 必须在login()之后加这个代码
client.setFileType(FTP.BINARY_FILE_TYPE);
整体代码:
public static FTPClient initClient() throws IOException { FTPClient client = new FTPClient(); client.setConnectTimeout(ftpConf.getConnectTimeoutMills()); client.setControlEncoding(ftpConf.getEncoding()); client.enterLocalPassiveMode(); //解决中文乱码问题 client.setAutodetectUTF8(true); client.connect(ftpConf.getHost(), ftpConf.getPort()); client.login(ftpConf.getUsername(), ftpConf.getPassword()); if (!FTPReply.isPositiveCompletion(client.getReplyCode())) { log.error("未连接到ftp({}:{}),用户名或密码错误", ftpConf.getUsername(), ftpConf.getPassword()); client.disconnect(); } else { log.info("ftp({}:{})连接成功", ftpConf.getHost(), ftpConf.getPort()); } client.setFileType(FTP.BINARY_FILE_TYPE); return client; }
这个是 我在上面加
client.setFileType(FTP.BINARY_FILE_TYPE);
的时候, 加在了login()
之前导致的