1 引入pom依赖
<!-- 上传下载依赖 -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.8.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
commons-net用来连接linux服务器的,ftp上传文件的
commons-io用来操作文件的
2 FileController
@PostMapping("/image/upload")
public Result imageUpload(@RequestParam("file") MultipartFile file) throws IOException {
return fileService.imageUploadToWin(file);
}
3 FileService实现
package com.grm.service;
import com.grm.common.Result;
import com.grm.security.details.LoginUser;
import com.grm.util.FtpUtil;
import com.grm.util.SecurityUtils;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
/**
* 文件服务
*
* @author gaorimao
* @date 2022/02/11
*/
@Service
public class FileService {
@Autowired
private SecurityUtils securityUtils;
@Autowired
private FtpUtil ftpUtil;
/**
* 图片上传到linux
*
* @param file 文件
* @return {@link Result}
* @throws IOException ioexception
*/
public Result imageUploadToLinux(MultipartFile file) throws IOException {
LoginUser loginUser = securityUtils.getLoginUser();
String fileName = file.getOriginalFilename();//获取文件名
String suffixName = fileName.substring(fileName.lastIndexOf("."));//获取文件的后缀名
// 重新设置上传到服务器的文件名
fileName = loginUser.getUsername() + "_" + new Date().getTime() + suffixName;
//上传的文件名也需要加上后缀,不然虚拟机不知道文件格式
InputStream inputStream = file.getInputStream();
String filePath = "/home/upload/image";
boolean flag = ftpUtil.uploadFile(fileName, filePath, inputStream);//主要就是这里实现了ftp的文件上传
filePath = filePath + "/" + fileName;
if (flag) {
return Result.success("文件上传成功!", filePath);
}
return Result.failed(500, "文件上传失败!");
}
/**
* 上传文件到本地
*
* @param file 文件
* @return {@link Result}
* @throws IOException ioexception
*/
public Result imageUploadToWin(MultipartFile file) throws IOException {
LoginUser loginUser = securityUtils.getLoginUser();
String fileName = file.getOriginalFilename();//获取文件名
String suffixName = fileName.substring(fileName.lastIndexOf("."));//获取文件的后缀名
// 重新设置上传到服务器的文件名
fileName = loginUser.getUsername() + "_" + new Date().getTime() + suffixName;
InputStream inputStream = file.getInputStream();
File winFile = new File("C://upload//image//"+fileName);
FileUtils.copyInputStreamToFile(file.getInputStream(),winFile);
return Result.success("文件上传成功!",winFile.getAbsolutePath());
}
}
其中上传到linux时,需要用到FtpUtils
package com.grm.util;
import com.grm.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
/**
* ftp工具类
*
* @author gaorimao
* @date 2022/02/11
*/
@Slf4j
@Component
public class FtpUtil {
//参数传过来了文件和文件的输入流
public boolean uploadFile(String originFileName, String filePath, InputStream input) throws IOException {
boolean success = false;
FTPClient ftp = new FTPClient();//这是最开始引入的依赖里的方法
ftp.setControlEncoding("utf-8");
int reply;
ftp.connect("xxx", 21);// 连接FTP服务器
ftp.login("root", "xxx");// 登录
reply = ftp.getReplyCode();//连接成功会的到一个返回状态码
log.info("链接状态===",reply);
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
throw new BusinessException(500, "链接linux服务器失败!");
}
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//设置文件类型
ftp.changeWorkingDirectory(filePath);//修改操作空间
ftp.storeFile(originFileName, input);//这里开始上传文件
input.close();
ftp.logout();
success = true;
if (ftp.isConnected()) {
ftp.disconnect();
}
return success;
}
}
3 postman测试
4 上传linux需要在centos7上搭建ftp
yum -y install vsftpd
whereis vsftpd
启动ftp命令
systemctl start vsftpd.service
查看是否启动成功
netstat -npal|grep vsftpd