解决ftp上传文件速度比较慢的问题!

9243 admin
世界杯开球

问题描述:

最近在项目中遇到一个问题,每次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

点击查看ftp的配置

方案三:同样是针对建立连接慢的解决方案

分析问题:既然他建立连接慢,也就是说他建立连接不容易,既然不容易我就让他建立连接以后一直保持连接。但是此种方式对资源的耗费很高,不建议这么做。

具体实现思路如下(单例模式+定时器+锁):

打印机如何取消打印任务?Win10打印机取消打印任务的方法 常见观赏鱼的种类图片和名字(10 种适合饲养的淡水观赏鱼)