1.解决fpt文件下载图片时失真的问题
参考链接:https://blog.csdn.net/truffle528/article/details/79551368
在用ftp将本地图片传输到服务器时发现图片被损坏,原因是使用了错误的传输类型使得源文件被修改了。
ftp有两种传输方式:二进制模式和ascll模式。
二进制模式是将文件直接传到服务器,不做任何改动。
ascll模式会将回车换行符修改为本机的回车换行符,会对源文件进行修改。比如windows的是‘\r\n’传送到unix会变成‘\n’。
基于这样的特性,在传输文本文件时我们通常使用ascll模式,而传输图片或者可执行文件时就需要切换为二进制模式。
需要注意的是在使用ascll模式打开服务器上图片时也会显示错误,因为程序会将图片传送到本地的临时文件,再打开。这也相当于对源文件进行了修改,所以只对服务器上的图片进行查看也需要切换为二进制模式。
代码逻辑
public static boolean downloadImage(String hostname, int port, String username, String password, String pathname, String filename, String localFileName, String localpath){
boolean flag = false;
FTPClient ftpClient = new FTPClient();
try {
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//设置文件类型
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//设置linux ftp服务器
FTPClientConfig conf = new FTPClientConfig( FTPClientConfig.SYST_UNIX);
ftpClient.configure(conf);
//验证FTP服务器是否登录成功
int replyCode = ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(replyCode)){
System.out.println("登录失败");
return flag;
}
//设置访问被动模式
ftpClient.setRemoteVerificationEnabled(false);
ftpClient.enterLocalPassiveMode();
//切换FTP目录
ftpClient.changeWorkingDirectory(pathname);
OutputStream os = new FileOutputStream(localpath + "/" + localFileName);
flag = ftpClient.retrieveFile(filename, os);
os.close();
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try {
ftpClient.logout();
} catch (IOException e) {
}
}
}
return flag;
}
2.java实现FTP下载,解决假死的问题
参考链接:https://blog.csdn.net/ranger1911/article/details/41007363
前些日子一个小项目,需要使用java,通过FTP下载文件,之前没弄过,百度了一下,用高人提供的方法试了一下,果然能够顺利的连接FTP并下载,但很快,就发现了一个问题,在下载过程中,程序出现假死的现象,就是,既不报错,也不抛异常,还不终止,就是一直的跑啊跑啊的,每个头,自己研究了好长时间,也不知道怎么回事,后来上网又查了查,有人提出了一个方法,真心好用,在这里分享下:
在调用FTPClient.listFiles()或者FTPClient.retrieveFile()方法前,调用FTPClient.enterLocalPassiveMode()!
用人家的原话说,就是“这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。”说实话这是什么意思,我这个水平还不是很懂,望大家指教,现把FTP相关代码贴出来,与大家共享。
//创建FTP连接
ftpClient.setDefaultPort(//FTP端口号);
ftpClient.connect(//FTP服务IP地址);
ftpClient.login(//FTP用户名, //密码);
ftpClient.setBufferSize(1024);
//设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据
ftpClient.enterLocalPassiveMode();
//从FTP下载文件
boolean b = ftpClient.retrieveFile(//FTP文件路径及文件名, //用以保存文件的文件输出流);