图片服务器vsftpd

背景:在企业内一般会搭建单独的图片服务器,把图片存储在独立的服务器上,进行独特的优化,提高访问速度。后台程序就需要使用 ftp 把图片上传到图片服务器。用户上传图片到 war,war 上传图片到图片服务器。图片服务器需要安装 ftp 软件,最常用的软件是 vsftpd。

vsftpd 的安装流程:

  1. 使用 yum 安装
yum install -y vsftpd
  1. 进入 /etc/vsftpd 目录,分别删除 ftpusers文件中的 root 和 user_list 文件中的 root
cd /etc/vsftpd
rm -f ftpusers/root
rm -f user_list/root
  1. 使用 systemctl 命令管理 vsftpd

web 程序使用 ftp 上传文件:

  1. 引入依赖
		<!--web 程序中使用ftp上传文件-->
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.6</version>
        </dependency>
  1. 在 util 引入 FTPUtils 工具类
package com.zhiyou100.utils;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * @author zhangfan
 * @date 2019/9/23
 */
public class FTPUtils {
    private static final String HOSTNAME = "master";
    private static final Integer PORT = 21;
    private static final String USERNAME = "root";
    private static final String PASSWORD = "123456";
    private static final String SAVEPATH = "/usr/share/nginx/zycf/images/";

    /**
     * 上传文件
     * @param file 待上传文件
     * @param saveName 上传后的文件名字
     */
    public static void uploadFile(MultipartFile file, String saveName) throws IOException {

        // 创建 ftp 客户端
        FTPClient ftpClient = new FTPClient();

        // 设置字符编码格式为 utf-8
        ftpClient.setControlEncoding("utf-8");

        //连接 ftp 服务器
        ftpClient.connect(HOSTNAME, PORT);

        //登录 ftp 服务器
        ftpClient.login(USERNAME, PASSWORD);

        // 如果登录失败,则断开链接
        if(!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){

            ftpClient.disconnect();//断开连接

            System.out.println("登录失败");

            return;
        }

        // 设置工作模式为上传文件
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

        // 切换到上传目录
        ftpClient.changeWorkingDirectory(SAVEPATH);

        // 上传文件
        ftpClient.storeFile(saveName, file.getInputStream());
    }
}

  1. 使用 FTPUtils.uploadFile() 方法上传文件
package com.zhiyou100.service.fileuploadallservice.impl;

import com.zhiyou100.service.FileUploadAllService;
import com.zhiyou100.utils.FTPUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * @author zhangfan
 * @date 2019/9/18
 */
@Service
public class FileUploadAllServiceImpl implements FileUploadAllService {

    @Override
    public String upload(MultipartFile file) {
        if(file != null && !file.isEmpty()){
            //获取原文件名
            String fileName = file.getOriginalFilename();
            try {
                //用于服务器上
                FTPUtils.uploadFile(file,fileName);
                //用于自己电脑上
//                file.transferTo(new File("D:/IDEAkongjian/zy-crowd-funding/src/main/webapp/img/" + fileName));
            } catch (IOException e) {
                e.printStackTrace();
            }
            return file.getOriginalFilename();
        }
        return null;
    }
}

上传图片:
把图片保存到 /usr/share/nginx/zycf/images 目录
返回访问地址 http://master/zycf/images/xxx

package com.zhiyou100.demo.controller;

import com.zhiyou100.demo.service.FileUploadAllService;
import com.zhiyou100.demo.vo.ResponseVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**所有文件上传
 * 采用vsftpd技术
 * @author zhangfan
 * @date 2019/10/9
 */
@RestController
public class FileController {

    /**
     * 注入传输文件服务层
     */
    @Autowired
    private FileUploadAllService fileUploadAllService;


    /**
     * 上传文件
     * @param file
     * @return
     */
    @PostMapping("/files")
    public ResponseVo fileUpload(MultipartFile file){

        String fileName = fileUploadAllService.upload(file);

        return new ResponseVo(200,null,"http://master/zycf/images/" + fileName);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值