**

一、使用docker 安装 vsftpd**

参考文档:
使用docker部署文件服务器:

1.1 获取镜像

#寻找vsftpd的镜像

1.1.1.docker search vsftpd

java项目上传文件后台上传到其他服务器 java实现上传文件到服务器_文件服务器

1.1.2.docker pull fauria/vsftpd

java项目上传文件后台上传到其他服务器 java实现上传文件到服务器_图片展示_02

1.2 创建vsftpd容器

docker run -d -p 21:21 -p 20:20 -p 21100-21110:21100-21110 -v /Ftpfile:/home/vsftpd -e FTP_USER=连接用户名 -e FTP_PASS=连接密码 -e PASV_ADDRESS=你的ip -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 --name vsftpd --restart=always fauria/vsftpd

java项目上传文件后台上传到其他服务器 java实现上传文件到服务器_文件服务器_03

注释说明:
#FTP_USER : 设置远程连接的账户名
#FTP_PASS : 远程连接的密码
#-p进行端口绑定映射
-v进行文件目录的映射 FTP_UESR 和FTP_PASS如果设定了会在container里面的
#/etc/vsftpd/virtual_users.txt
#PASV_MIN_PORT和PASV_MAX_PORT映射的是被动模式下端口使用范围
#PASV_ADDRESS指的的宿主机地址

1.3 修改配置

1、我们先进入container里面
docker exec -i -t vsftpd bash
2、修改并生成虚拟用户模式下的用户db文件
vi /etc/vsftpd/virtual_users.txt
#编辑配置文件写入用户跟密码
3、假如我们添加了user用户
mkdir /home/vsftpd/user #建立新用户文件夹
/usr/bin/db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db
#把登录的验证信息写入数据库

1.4 重启,使用Xftp验证连接

先退出容器 :Ctrl +d
重启vsftpd 服务: docker restart vsftpd

二、Java 实现文件上传**

2.1 引入maven 依赖

<dependency>
        <groupId>commons-net</groupId>
        <artifactId>commons-net</artifactId>
        <version>3.3</version>
</dependency>

2.2 编写文件上传方法

/**

  • 保存图片到文件服务器
  • @param file
  • @return
    */
    public static String uploadImageToFileServer(MultipartFile file) {
if(file.getSize() > EViewConstant.FtpFileServer.SIZE){
         log.info("上传的文件大小超过10mb");
         return  "";
     }
     InputStream inputStream = null;
 
     String fileName = file.getOriginalFilename();
     //获取文件的格式
     String fileType = fileName.substring(fileName.indexOf(".")).toLowerCase().trim();
     //生成一个随机的文件名,避免重名覆盖
     String randomString= UUID.randomUUID().toString().replaceAll("-","");
     String fileNewName = randomString+fileType;
 
     FTPClient ftpClient = new FTPClient();
     try{
         //连接到FTP 服务器
         ftpClient.connect(EViewConstant.FtpFileServer.HOST, EViewConstant.FtpFileServer.PORT);
         ftpClient.login(EViewConstant.FtpFileServer.USER_NAME,EViewConstant.FtpFileServer.PASSWORD);
         //ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
         ftpClient.changeWorkingDirectory("/Ftpfile/eiot");
         //ftp上传文件是以文本形式传输的,所以多媒体文件会失真,需要转为二进制形式传输
         ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
         if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
             log.info("未连接到FTP,用户名或密码错误。");
             ftpClient.disconnect();
         } else {
             log.info("FTP连接成功");
         }
         long start = System.currentTimeMillis();
         inputStream = file.getInputStream();
         //转码后可以文件名可以为中文ftpClient.storeFile(new String(fileNewName.getBytes("GBK"), "iso-8859-1"), inputStream);
        // ftpClient.enterLocalPassiveMode();
         boolean fig = ftpClient.storeFile(fileNewName, inputStream);
         if(fig){
             long end = System.currentTimeMillis();
             log.info(String.format("文件:%s上传成功,耗时:%d毫秒",fileNewName,(end-start)));
         }else {
             log.info("上传失败");
             return  "";
         }
     }catch (IOException io){
          io.printStackTrace();
          log.error("保存图片到文件服务器ERROR:"+io.getMessage());
          return  "";
     }finally {
         //关闭资源
         try {
             if(null != inputStream){
                 inputStream.close();
             }
             //退出
             ftpClient.logout();
             //断开连接
             ftpClient.disconnect();
         }catch (IOException io){
             log.error("保存图片到文件服务器关闭资源ERROR"+io.getMessage());
         }
     }
     return  EViewConstant.FtpFileServer.IMAGE_URL+fileNewName;

}

上传成功

java项目上传文件后台上传到其他服务器 java实现上传文件到服务器_文件服务器_04


java项目上传文件后台上传到其他服务器 java实现上传文件到服务器_图片展示_05

三、图片展示

3.1 文件展示需要配置nginx 的配置文件

/etc/nginx/conf.d

vi default.conf

增加一个server配置

java项目上传文件后台上传到其他服务器 java实现上传文件到服务器_FTPClient_06


#图片配置

server{

listen 90;

server_name localhost;

location ~ .(gif|jpg|jpeg|png|bmp|swf)$ {

root /Ftpfile;

proxy_temp_path /Ftpfile;

}

}

设置nginx 访问权限(修改为root):

java项目上传文件后台上传到其他服务器 java实现上传文件到服务器_文件服务器_07


浏览器地址直接输入:ip +端口+图片路径

java项目上传文件后台上传到其他服务器 java实现上传文件到服务器_图片上传_08