10.springboot结合ftp实现文件上传下载

1.ftp服务器安装

  1. 找一台机器安装ftp,执行以下命令
yum install -y vsftpd
  1. 找到ftp安装目录,默认安装在:/etc/vsftpd/,其下有如下几个文件,可以进行相关配置

10.springboot结合ftp实现文件上传下载_第1张图片
ftpusers: 黑名单,此文件中的用户不允许访问ftpf服务(root默认在里面)
user_list: 白名单,允许用户访问ftp服务(记得看文件说明)
vsftpd.conf: 详细的相关配置文件

  1. 修改配置
    默认情况下ftp是可以不用账号密码登录的,需要修改,另外root账号默认也是无法使用,需要添加账号密码
# 添加一个账号密码
useradd ftptest
passwd ftptest  

取消匿名用户登录设置

vi vsftpd.conf 
修改以下配置,yes改成no: anonymous_enable=NO

  1. 启动服务测试
# 启动服务
systemctl start vsftpd

# 查看下状态
systemctl status vsftpd

测试:
10.springboot结合ftp实现文件上传下载_第2张图片默认文件是放在登录用户的家目录下

2.springboot整合ftp实现文件上传下载

  1. porm文件中导入依赖:
        
        <dependency>
            <groupId>commons-netgroupId>
            <artifactId>commons-netartifactId>
            <version>3.6version>
        dependency>

        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-configuration-processorartifactId>
            <optional>trueoptional>
        dependency>
  1. 控制层的代码:
@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";
    }
}
  1. 封装一个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; // 存储的位置
}

  1. 在配置文件中设置相关值
ftp:
  hostname: 192.168.175.163
  port: 21
  username: ftptest
  password: ftptest
  save-path: /home/ftptest/ftp
  1. 封装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();
        }

    }
}


  1. 前端代码:
<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

你可能感兴趣的:(springboot,spring,boot)