问题描述:
最近在项目中遇到一个问题,每次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读写,缓冲区是如何提高读写效率的?
/zealot_2002/article/details/8231194
该博客讲述很明白
方案二:针对建立连接慢的解决方案
如下解决
vi /etc/vsftpd/vsftpd.conf
在vsftpd.conf文件中加入:reverse_lookup_enable=NO
保存后重新启动vsftpd: service vsftpd restart
点击查看ftp的配置
方案三:同样是针对建立连接慢的解决方案
分析问题:既然他建立连接慢,也就是说他建立连接不容易,既然不容易我就让他建立连接以后一直保持连接。但是此种方式对资源的耗费很高,不建议这么做。
具体实现思路如下(单例模式+定时器+锁):