ftp服务器搭建(windows)+实现ftp图片上传对接

2018/03/06 15:47
阅读数 34

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服务器开启,才能正确连接并上传。

 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 }
View Code

 3.写一个工具类FTPUtil,专门做图片上传的工作,在这个工具类中,从properties配置文件中拿到ip,user,pwd,在连接到ftp服务器后,用FTPClient做上传工作。

  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 }
View Code

4.提供给controller:

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);
View Code

5.在开启ftp服务器后,还需要开启nginx,才能利用nginx反向代理,定位到http://img.mall.com/...

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部