<>1.ftp服务器安装
* 找一台机器安装ftp,执行以下命令 yum install -y vsftpd
* 找到ftp安装目录,默认安装在:/etc/vsftpd/,其下有如下几个文件,可以进行相关配置
ftpusers: 黑名单,此文件中的用户不允许访问ftpf服务(root默认在里面)
user_list: 白名单,允许用户访问ftp服务(记得看文件说明)
vsftpd.conf: 详细的相关配置文件
* 修改配置
默认情况下ftp是可以不用账号密码登录的,需要修改,另外root账号默认也是无法使用,需要添加账号密码 # 添加一个账号密码 useradd
ftptest passwd ftptest
取消匿名用户登录设置
vi vsftpd.conf 修改以下配置,yes改成no: anonymous_enable=NO
* 启动服务测试 # 启动服务 systemctl start vsftpd # 查看下状态 systemctl status vsftpd
测试:
默认文件是放在登录用户的家目录下
<>2.springboot整合ftp实现文件上传下载
* porm文件中导入依赖: <!-- 导入ftp的依赖 --> <dependency> <groupId>commons-net</groupId> <
artifactId>commons-net</artifactId> <version>3.6</version> </dependency> <!--
配置文件自动联想自定义的属性 --> <dependency> <groupId>org.springframework.boot</groupId> <
artifactId>spring-boot-configuration-processor</artifactId> <optional>true</
optional> </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"; } }
* 封装一个ftpBean用于获取配置文件里面连接ftp的相关值 /** * @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
* 封装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
FTPClientgetConnection() { 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>
<>3.springboot关于文件的设置
spring: servlet: multipart: max-file-size: 1MB # 默认单个文件的上传大小时1MB
max-request-size: 10MB # 默认一次上传的总文件大小为10MB