yum install -y vsftpd
ftpusers: 黑名单,此文件中的用户不允许访问ftpf服务(root默认在里面)
user_list: 白名单,允许用户访问ftp服务(记得看文件说明)
vsftpd.conf: 详细的相关配置文件
# 添加一个账号密码
useradd ftptest
passwd ftptest
取消匿名用户登录设置
vi vsftpd.conf
修改以下配置,yes改成no: anonymous_enable=NO
# 启动服务
systemctl start vsftpd
# 查看下状态
systemctl status vsftpd
<dependency>
<groupId>commons-netgroupId>
<artifactId>commons-netartifactId>
<version>3.6version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
@Controller
public class FIleController {
// 文件上传
@PostMapping("/upload")
@ResponseBody
public String upload(@RequestPart("uploadfile1") MultipartFile file,
@RequestPart("uploadfile2") MultipartFile[] files) throws IOException {
// 单文件上传:通过ftp封装的工具类,将文件传递到指定的文件服务器
if (!file.isEmpty()) {
InputStream inputStream = file.getInputStream();
String filename = file.getOriginalFilename();
ftpUtils.uploadFile(filename,inputStream);
}
// 多文件上传: 模拟将其放到项目部署机器指定位置
for (MultipartFile multipartFile : files) {
String filename = multipartFile.getOriginalFilename();
multipartFile.transferTo(new File("d:/test/" + filename));
}
return "seccess";
}
// 文件下载
@GetMapping("/download")
@ResponseBody
public String download() {
ftpUtils.downloadFile("d:/" , "397cf64bf78ccd35335ccf5d4c82b9bd.webp");
return "success";
}
}
/**
* @description: 封装类,用于获取配置文件的相关值
* @author: zengwenbo
* @date: 2021/7/5 14:00
*/
@Data
@Component
@ConfigurationProperties(prefix = "ftp")
public class FTPBean {
private String hostname; // 机器的ip
private int port; // 端口号:21
private String username; // 账号
private String password; // 密码
private String savePath; // 存储的位置
}
ftp:
hostname: 192.168.175.163
port: 21
username: ftptest
password: ftptest
save-path: /home/ftptest/ftp
/**
* @description: 封装工具类,实现文件的上传下载
* @author: zengwenbo
* @date: 2021/7/4 13:08
*/
@Slf4j
@Component
public class ftpUtils {
@Autowired
private FTPBean reFtpBean;
private static FTPBean ftpBean;
@PostConstruct
public void init() {
ftpBean = reFtpBean;
log.info("初始化完成");
}
// 连接ftp
public static FTPClient getConnection() {
FTPClient ftpClient = new FTPClient();
try {
// 设置连接机器
ftpClient.connect(ftpBean.getHostname(), ftpBean.getPort());
ftpClient.login(ftpBean.getUsername(), ftpBean.getPassword());
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
log.info("ftp连接失败");
ftpClient.disconnect(); // 断开连接
return null;
} else {
log.info("ftp连接成功");
}
// 将文件类型设置成二进制
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// 创建要存储文件夹的目录: 主要目录只能一级一级创建,不能一次创建多层; 在 选择创建目录是一定要看是否有写权限,不然失败
ftpClient.makeDirectory(ftpBean.getSavePath());
// 改变默认存放的位置
ftpClient.changeWorkingDirectory(ftpBean.getSavePath());
//开启被动模式,否则文件上传不成功,也不报错
ftpClient.enterLocalPassiveMode();
} catch (IOException e) {
log.error(e.getMessage());
return null;
}
return ftpClient;
}
// 上传文件
public static void uploadFile(String fileName, InputStream inputStream) {
FTPClient ftpClient = getConnection();
if (ftpClient == null) {
return;
}
try {
boolean result = ftpClient.storeFile(fileName, inputStream);
log.info("文件是否保存成功:" + result);
inputStream.close();
ftpClient.logout();
} catch (IOException e) {
e.printStackTrace();
}
}
// 文件下载
/**
*
* @param fileName
* @param localPath 不指定表示下载到当前项目下
*/
public static void downloadFile( String localPath, String fileName) {
FTPClient ftpClient = getConnection();
if (ftpClient == null) {
return;
}
try {
FTPFile[] ftpFiles = ftpClient.listFiles();
for (FTPFile ftpFile : ftpFiles) {
if (fileName.equals(ftpFile.getName())) {
File file = new File(localPath+fileName);
OutputStream outputStream = new FileOutputStream(file);
boolean result = ftpClient.retrieveFile(ftpFile.getName(), outputStream);
log.info("下载结果:" + result);
outputStream.close();
}
}
ftpClient.logout();
} catch (IOException e) {
e.printStackTrace();
}
}
}
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploadfile1" placeholder="选择文件1"/>
<input type="file" name="uploadfile2" multiple="multiple" placeholder="选择文件2"/>
<input type="submit" value="提交">
form>
<a href="/download">文件下载a>
spring:
servlet:
multipart:
max-file-size: 1MB # 默认单个文件的上传大小时1MB
max-request-size: 10MB # 默认一次上传的总文件大小为10MB