问题描述:
最近在项目中遇到一个问题,每次ftp上传图片的的速度都超级慢,测试的妹子都要爆炸了,她说我就上传一个几十k的图片都点击一下要等半天,于是便给我提了一个bug要我去解决的这问题,然后我一边开始debug代码,一边去网上找解决方案!
找出原因:
ftp上传文件速度慢主要有两方面的原因:
1.网络问题,网速限制,并且没使用缓冲流来操作,导致上传的速度比较慢!
2.登录ftp与ftp建立连接比较慢
最终得到如下三种解决方案:
方案一:针对网速差,读取文件的速度慢,可以使用缓冲区来提高效率!
项目源码如下:
public static boolean upload(String ftpUrl, File file,String areaDeviceImgPath,String newFileName)throws Exception{
FtpConfInfo infoConf = getInfo(ftpUrl);
if(infoConf == null){
return false;
}
FTPClient ftpclient = connectServer(infoConf);
if(ftpclient == null){
log.error("构建FTP客户端失败");
}
if(infoConf.getLocation()!=null){
String[] ss = infoConf.getLocation().split(Constants.SEPARATOR);
for(String s :ss){
if(!existDirectory(ftpclient,s)){
ftpclient.mkd(s);
}
ftpclient.changeWorkingDirectory(s);
}
}
FtpUtil.fileMkDir(ftpclient,areaDeviceImgPath);
InputStream is = null;
boolean bool = false;
try {
ftpclient.enterLocalPassiveMode();
is =new FileInputStream(new File(file.getAbsolutePath()));
bool = ftpclient.storeFile(newFileName,is);
ftpclient.changeToParentDirectory();
ftpclient.logout();
closeServer(ftpclient);
if(bool){
log.info("文件传输到FTP成功");
}
else {
log.info("文件传输到FTP失败");
}
} catch (Exception e) {
log.error(e);
}finally{
is.close();
}
return bool;
}
改进后的代码如下:
public static boolean upload(String ftpUrl, MultipartFile file,String areaDeviceImgPath,String newFileName)throws Exception{
FtpConfInfo infoConf = getInfo(ftpUrl);
if(infoConf == null){
return false;
}
FTPClient ftpclient = connectServer(infoConf);
if(ftpclient == null){
log.error("构建FTP客户端失败");
}
if(infoConf.getLocation()!=null){
String[] ss = infoConf.getLocation().split(Constants.SEPARATOR);
for(String s :ss){
if(!existDirectory(ftpclient,s)){
ftpclient.mkd(s);
}
ftpclient.changeWorkingDirectory(s);
}
}
FtpUtil.fileMkDir(ftpclient,areaDeviceImgPath);
//InputStream is = null;
BufferedInputStream input= null;
boolean bool = false;
try {
ftpclient.enterLocalPassiveMode();
//is = file.getInputStream();
ftpclient.setBufferSize(1024*1024);
byte [] fileBytes=file.getBytes();
input= new BufferedInputStream( new ByteArrayInputStream(fileBytes));
bool = ftpclient.storeFile(newFileName,input);
ftpclient.changeToParentDirectory();
ftpclient.logout();
closeServer(ftpclient);
if(bool){
log.info("文件传输到FTP成功");
}
else {
log.info("文件传输到FTP失败");
}
} catch (Exception e) {
log.error("文件上传失败:" + e);
return false;
}finally{
input.close();
}
return bool;
}
问题:关于java的io读写,缓冲区是如何提高读写效率的?
https://blog.csdn.net/zealot_2002/article/details/8231194
该博客讲述很明白
方案二:针对建立连接慢的解决方案
如下解决
vi /etc/vsftpd/vsftpd.conf
在vsftpd.conf文件中加入:reverse_lookup_enable=NO
保存后重新启动vsftpd: service vsftpd restart
方案三:同样是针对建立连接慢的解决方案
分析问题:既然他建立连接慢,也就是说他建立连接不容易,既然不容易我就让他建立连接以后一直保持连接。但是此种方式对资源的耗费很高,不建议这么做。
具体实现思路如下(单例模式+定时器+锁):