前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Linux CentOS7.7中搭建FTP服务并在Springboot中集成

在Linux CentOS7.7中搭建FTP服务并在Springboot中集成

原创
作者头像
荷秋
修改2023-03-28 14:38:18
1K0
修改2023-03-28 14:38:18
举报
文章被收录于专栏:开发Notes开发Notes

背景

在项目中经常需要用到文件上传,使用FTP服务可以将文件存储于项目运行处分离开

于是我打算使用FTP服务 ,并且选择了vsftpd

安装教程

1.使用命令在线安装vsftpd
代码语言:shell
复制
yum -y install vsftpd
2.关闭匿名访问
代码语言:txt
复制
vim /etc/vsftpd/vsftpd.conf

anonymous_enable = NO

3.启动服务
代码语言:txt
复制
systemctl start vsftpd.service
4.查看ftp服务状态
代码语言:txt
复制
systemctl status vsftpd.service

active(running)表示运行成功

5.开放防火墙访问端口
代码语言:txt
复制
firewall-cmd --zone=public --add-port=21/tcp --permanent
firewall-cmd --zone=public --add-port=1025-65535/tcp --permanent
systemctl restart firewalld

查看防火墙状态(我在本地虚拟机中是直接禁用防火墙了的 仅供参考)

代码语言:txt
复制
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
# 查看防火墙状态
systemctl status firewalld
6.添加用户和密码
代码语言:txt
复制
adduser user-file

passwd user-file
7.在ftp服务中上传的文件都存在了虚拟机的/home/user-file中

存在了home目录下的用户名目录

集成Springboot实现文件上传

代码语言:java
复制
@Slf4j
@Component
public class FtpHelper {
    //FTPClient的配置
    @Autowired
    private FtpClientConfig ftpClientConfig;
    //静态的用于在工具类接收自动装配的config
    private static FtpClientConfig ftpConfig;
    //静态的FTPClient
    private static FTPClient ftp;
    //仓库文件名
    private static String StockRoom = "/store";
    //在spring容器初始化的时候执行
    @PostConstruct
    public void setconfig() {
        ftpConfig=ftpClientConfig;
    }

    /**
     * 初始化FTPClient
     * @return
     */
    public static boolean initFtpClient() {
        ftp = new FTPClient();
        try {
            ftp.connect(ftpConfig.host, ftpConfig.port);
            int replyCode = ftp.getReplyCode();
            if(!FTPReply.isPositiveCompletion(replyCode)){
                ftp.disconnect();
                log.warn("FTPServer refused connection,replyCode:{}", replyCode);
                return false;
            }
            if(!ftp.login(ftpConfig.username,ftpConfig.password)){
                log.warn("ftpClient login failed... username is {}; password: {}", ftpConfig.username, ftpConfig.password);
                return false;
            }
            ftp.setBufferSize(10240);
            ftp.setDataTimeout(600000*60);
            ftp.setConnectTimeout(600000*60);
            ftp.setFileType(FTP.BINARY_FILE_TYPE);//二进制
            ftp.enterLocalPassiveMode();//被动模式
        } catch (IOException e) {
            log.error("create ftp connection failed...", e);
        }
        return true;
    }

    /**
     * 上传文件
     * @param multipartFile
     * @param newName
     * @return
     */
    public static boolean uploadFile(MultipartFile multipartFile,String newName){
        InputStream inputStream =null;
        if(!initFtpClient()){
            return false;
        }
        try {
            
            inputStream= multipartFile.getInputStream();
            log.info("start upload... {}", multipartFile.getOriginalFilename());
            String overPath = ftpConfig.basepath+StockRoom+"/"+ LocalDate.now();
            boolean dirSuccess = ftp.changeWorkingDirectory(overPath);
            if(!dirSuccess){
                ftp.makeDirectory(ftpConfig.basepath+StockRoom);
                ftp.makeDirectory(overPath);2023-01-07
                ftp.changeWorkingDirectory(overPath);
            }
            boolean storeFileFlag = ftp.storeFile(new String(newName.getBytes("GBK"), "iso-8859-1"), inputStream);
            if(storeFileFlag){
                log.info("upload file success! {}", multipartFile.getOriginalFilename());
                return true;
            }
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(inputStream);
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        log.warn("upload file failure! {}", multipartFile.getOriginalFilename());
        return false;
    }

    /**
     * 文件下载
     * @param outputStream
     * @param path
     * @param storename
     * @param displayName
     * @return
     */
    public static boolean downloadFile(OutputStream outputStream,String path,String storename,String displayName) {

        if(!initFtpClient()){
            return false;
        }
        String overPath = ftpConfig.basepath+StockRoom + path+"/"+storename;
        log.info("start download... {}", displayName);


        try {
            boolean retrieveFileFlag = ftp.retrieveFile(new String(overPath.getBytes("GBK"), "iso-8859-1"), outputStream);
            if(retrieveFileFlag){
                log.warn("download file success! {}", displayName);
                return true;
            }
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(outputStream);
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        log.warn("download file failure! {}", displayName);
        return false;
    }

}

想在Nginx映射这个目录实现可访问下载

在Nginx配置中设置

代码语言:javascript
复制
user  user-file

代码语言:javascript
复制
  server {
    listen   6000;        
        location / {
            autoindex on;
            root /home/user-file;
        }
   }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 安装教程
  • 集成Springboot实现文件上传
  • 想在Nginx映射这个目录实现可访问下载
    • 在Nginx配置中设置
    相关产品与服务
    文件存储
    文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档