Bootstrap

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

问题描述:

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

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

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

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

 

;