背景:在企业内一般会搭建单独的图片服务器,把图片存储在独立的服务器上,进行独特的优化,提高访问速度。后台程序就需要使用 ftp 把图片上传到图片服务器。用户上传图片到 war,war 上传图片到图片服务器。图片服务器需要安装 ftp 软件,最常用的软件是 vsftpd。
vsftpd 的安装流程:
- 使用 yum 安装
yum install -y vsftpd
- 进入 /etc/vsftpd 目录,分别删除 ftpusers文件中的 root 和 user_list 文件中的 root
cd /etc/vsftpd
rm -f ftpusers/root
rm -f user_list/root
- 使用 systemctl 命令管理 vsftpd
web 程序使用 ftp 上传文件:
- 引入依赖
<!--web 程序中使用ftp上传文件-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
- 在 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());
}
}
- 使用 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);
}
}