ftp服务器搭建(windows)+实现ftp图片上传对接
ftp服务器搭建(windows):
vsftpd简介:
vsftpd是“very secure FTP daemon”的缩写,是一个完全免费的、开放源代码的ftp服务器软件。
下载地址:
http://download.happymmall.com/FTPServer.rar
安装启动步骤:
1.下载解压,点击.exe文件,打开看到如下界面:
2.用户名和密码可以自己随意设置,只要在登录的时候用这个就可以了,共享目录是你要共享出去的你本地的一个目录,上传下载也都在这个里面。
3.打开cmd,输入ipconfig,查看你自己的Ipv4地址
4.在浏览器中输入ftp://你的ip地址,弹出登录框,登录即可看到你的共享目录中的内容。
实现ftp图片上传对接:
1.将ftp服务器需要的配置信息放入properties中,包括ip, user, pwd, 域名前缀。例如:
ftp.server.ip=211.69.197.245
ftp.user=cq
ftp.pass=ftp123
ftp.server.http.prefix=http://img.mall.com/
2.写一个service,上传图片文件到ftp服务器,在这个service中,对path以及文件名做一定的处理,然后具体的上传工作由调用FTPUtil来实现。此时运行后也就需要将ftp服务器开启,才能正确连接并上传。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @Service("iFileService") 2 public class FileServiceImpl implements IFileService{ 3 4 private Logger logger = LoggerFactory.getLogger(FileServiceImpl.class); 5 6 /** 7 * 上传图片文件到服务器 8 * @param file 要上传的图片文件 9 * @param path 上传路径 10 * @return 上传成功后的文件名返回 11 */ 12 public String upload(MultipartFile file, String path) { 13 //获取原始文件名 14 String fileName = file.getOriginalFilename(); 15 //获取文件扩展名 16 //lastIndexOf:返回"."在fileName中最后一个匹配项的索引位置,即abc.jpg会返回.jpg 17 String fileExtensionName = fileName.substring(fileName.lastIndexOf(".") + 1); 18 //为了防止不同用户上传图片时,两张图片的文件名完全相同导致覆盖的情况,这里对文件名加上UUID防重复 19 String uploadFileName = UUID.randomUUID().toString() + "." + fileExtensionName; 20 //打印日志,通过{}进行占位,也就是一个占位符对应后面的一个数据,类似于c里面的printf("%c",h); 21 logger.info("开始上传文件,上传文件的文件名:{},上传的路径:{},新文件名:{}", fileName, path, uploadFileName); 22 23 //创建上传路径目录的文件对象 24 File fileDir = new File(path); 25 if(!fileDir.exists()) { 26 //如果不存在 27 //赋予这个文件fileDir可写 28 fileDir.setWritable(true); 29 //创建文件 30 //mkdir():当前级别 31 //mkdirs():如果上传的文件所在的文件是/a,/b,/c等,直接传到服务器上时,这些文件夹都没有,用mkdirs()就可以自动创建 32 fileDir.mkdirs(); 33 } 34 File targetFile = new File(path, uploadFileName); 35 36 try { 37 file.transferTo(targetFile); 38 //将targetFile上传到我们的ftp服务器上 39 FTPUtil.uploadFile(Lists.newArrayList(targetFile)); 40 //已经上 传到ftp服务器上,删除upload下面的文件 41 targetFile.delete(); 42 } catch (IOException e) { 43 logger.error("上传文件异常", e); 44 return null; 45 } 46 return targetFile.getName(); 47 } 48 49 }
3.写一个工具类FTPUtil,专门做图片上传的工作,在这个工具类中,从properties配置文件中拿到ip,user,pwd,在连接到ftp服务器后,用FTPClient做上传工作。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class FTPUtil { 2 3 private static final Logger logger = LoggerFactory.getLogger(FTPUtil.class); 4 5 //根据key拿到value值 6 private static String ftpIp = PropertiesUtil.getProperty("ftp.server.ip"); 7 private static String ftpUser = PropertiesUtil.getProperty("ftp.user"); 8 private static String ftpPass = PropertiesUtil.getProperty("ftp.pass"); 9 10 //构造器 11 public FTPUtil(String ip,int port,String user,String pwd){ 12 this.ip = ip; 13 this.port = port; 14 this.user = user; 15 this.pwd = pwd; 16 } 17 //public开放方法 18 public static boolean uploadFile(List<File> fileList) throws IOException { 19 FTPUtil ftpUtil = new FTPUtil(ftpIp,21,ftpUser,ftpPass); 20 logger.info("开始连接ftp服务器"); 21 //remotePath是"img",也就是传到ftp文件夹下面的img这个文件夹下 22 boolean result = ftpUtil.uploadFile("img",fileList); 23 logger.info("ftp服务器,结束上传,上传结果:{}", result); 24 return result; 25 } 26 //上传的具体逻辑 27 //remotePath:远程路径,ftp服务器上的相对路径,上传到ftp服务器上,ftp服务器是一个文件夹,如果需要上传到这个文件夹下的一个文件夹的话,就需要用到remotePath 28 private boolean uploadFile(String remotePath,List<File> fileList) throws IOException { 29 boolean uploaded = true; 30 FileInputStream fis = null; 31 //连接FTP服务器 32 if(connectServer(this.ip,this.port,this.user,this.pwd)){ 33 try { 34 //更改工作目录,将remotePath传入,如果是null,则不需要切换 35 ftpClient.changeWorkingDirectory(remotePath); 36 //设置缓冲区 37 ftpClient.setBufferSize(1024); 38 //设置encoding编码 39 ftpClient.setControlEncoding("UTF-8"); 40 //设置文件类型为二进制类型,防止乱码 41 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 42 //打开本地的ftp的被动模式 43 ftpClient.enterLocalPassiveMode(); 44 for(File fileItem : fileList){ 45 fis = new FileInputStream(fileItem); 46 //将文件存入ftpClient 47 ftpClient.storeFile(fileItem.getName(),fis); 48 } 49 50 } catch (IOException e) { 51 logger.error("上传文件异常",e); 52 uploaded = false; 53 e.printStackTrace(); 54 } finally { 55 //关闭ftpClient 56 fis.close(); 57 ftpClient.disconnect(); 58 } 59 } 60 return uploaded; 61 } 62 //连接ftp服务器 63 private boolean connectServer(String ip,int port,String user,String pwd){ 64 65 boolean isSuccess = false; 66 ftpClient = new FTPClient(); 67 try { 68 //ftp服务器的ip 69 ftpClient.connect(ip); 70 //验证ftp服务器用户验证是否通过 71 isSuccess = ftpClient.login(user,pwd); 72 } catch (IOException e) { 73 logger.error("连接FTP服务器异常",e); 74 } 75 return isSuccess; 76 } 77 78 private String ip; 79 private int port; 80 private String user; 81 private String pwd; 82 //使用FTPClient上传下载 83 private FTPClient ftpClient; 84 85 public String getIp() { 86 return ip; 87 } 88 89 public void setIp(String ip) { 90 this.ip = ip; 91 } 92 93 public int getPort() { 94 return port; 95 } 96 97 public void setPort(int port) { 98 this.port = port; 99 } 100 101 public String getUser() { 102 return user; 103 } 104 105 public void setUser(String user) { 106 this.user = user; 107 } 108 109 public String getPwd() { 110 return pwd; 111 } 112 113 public void setPwd(String pwd) { 114 this.pwd = pwd; 115 } 116 117 public FTPClient getFtpClient() { 118 return ftpClient; 119 } 120 121 public void setFtpClient(FTPClient ftpClient) { 122 this.ftpClient = ftpClient; 123 } 124 }
4.提供给controller:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 String path = request.getSession().getServletContext().getRealPath("upload"); 2 String targetFileName = iFileService.upload(file, path); 3 String url = PropertiesUtil.getProperty("ftp.server.http.prefix") + targetFileName; 4 Map fileMap = Maps.newHashMap(); 5 fileMap.put("uri", targetFileName); 6 fileMap.put("url", url); 7 return ServerResponse.createBySuccess(fileMap);
5.在开启ftp服务器后,还需要开启nginx,才能利用nginx反向代理,定位到http://img.mall.com/...