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

     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/...

  • 相关阅读:
    常用经典SQL语句
    怎样找到PB打包所需要的dll和pbd文件?
    C#多线程参数传递
    Sqlserver 常用日期时间函数
    SQL Server:如何判断变量或字段是否为NULL
    用c#开发可供PB调用的COM组件
    ROW_NUMBER() OVER函数的基本用法用法
    SQL Server数据导入导出工具BCP详解
    IE下 Window.Open(url,name), name参数空格、符号问题
    数据库设计系列[05]多公司加入权限系统
  • 原文地址:https://www.cnblogs.com/cing/p/8514752.html
Copyright © 2020-2023  润新知