springboot 通过ftp 上传文件

1. 服务器安装ftp服务

1.1 Linux 安装ftp服务器

bash 复制代码
yum -y install vsftpd

(离线安装 ------见 文末 )

关闭SELINUX /// 非必要项

修改/etc/selinux/config文件,把SELINUX参数的值改为disabled。

SELINUX =disabled

启动vsftpd服务

ftp服务器的服务名是vsftpd,相关的操作如下:

bash 复制代码
systemctl start    vsftpd   # 启动服务。
systemctl stop    vsftpd    # 停止服务。
systemctl restart vsftpd    # 重启服务。
systemctl status  vsftpd    # 查看服务状态。
systemctl enable  vsftpd    # 启用开机自动动vsftpd服务。
systemctl disable vsftpd    # 禁用开机自动动vsftpd服务

1.2 新建账户,root 被限制

bash 复制代码
创建用户:
useradd ftpuser 

设置密码:
passwd ftpuser 

密码:Userftp@123

2. 创建文件目录

创建目录

bash 复制代码
mkdir /home/ftpuser/ftpfile

赋权

bash 复制代码
1、先对用户所属的的组赋权限: 
chown -R 用户名:用户组  目录 
sudo chown -R ftpuser:ftpuser /home/ftpuser/ftpfile/

2、再对目录赋予权限: 
chmod -R 775  目录
chmod -R 755 /home/ftpuser/ftpfile


3、查看文件夹的权限
ls -la 目录
ll 

3.ftp配置 PASV 模式

配置文件位置 : /etc/vsftpd/vsftpd.conf

bash 复制代码
#连接端口 默认21 
listen_port=2121

#PASV模式
pasv_enable=YES
# 端口范围 20-30个
pasv_min_port=2122
pasv_max_port=2142

#限制在目录
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/user_list
local_root=/home/ftpuser/ftpfile/

#禁止匿名访问
anonymous_enable=YES

# 问题 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
#允许用户在chroot环境中创建或修改文件 
allow_writeable_chroot=YES

4. 防火墙开放端口

bash 复制代码
 systemctl status firewalld 

 firewall-cmd --zone=public --add-port=2121-2142/tcp --permanent    (--permanent永久生效,没有此参数重启后失效)

 firewall-cmd --zone=public --list-ports

 systemctl start firewalld 

5. 连接测试

bash 复制代码
# 下载文件
curl -u yourusername:yourpassword ftp://ftp.example.com/filename -o localfilename
# 上传文件
curl -T localfilename -u yourusername:yourpassword ftp://ftp.example.com/

# 下载文件   /home/ftpuser/ftpfile/md.csv 下载到 /home/md1.csv   md1.csv必须文件,不能是目录
curl -u ftpuser:Userftp@123 ftp://192.168.62.131:2121/md.csv -o /home/md12.csv
# 上传文件 
curl -T /home/md12.csv -u ftpuser:Userftp@123 ftp://192.168.62.131:2121/
# 上传文件  改变文件名
curl -T /home/aa.txt -u ftpuser:Userftp@123 ftp://192.168.62.131:2121/aaaa-t.txt

6.代码编写

bash 复制代码
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.9.0</version>
        </dependency>
java 复制代码
jk.ftp.ip=192.168.62.131
jk.ftp.port=2121
#jk.ftp.port=21
jk.ftp.user=ftpuser
jk.ftp.pass=Userftp@123
## 上传到ftp服务器存放文件的路径
jk.ftp.path=/home/ftpuser/ftpfile/
java 复制代码
import org.apache.commons.net.ftp.FTPClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.UUID;

import static java.lang.System.*;

@Component
public class FTPUtil {

    @Value("${jk.ftp.ip}")
    private String ftpIp;

    @Value("${jk.ftp.port}")
    private Integer ftpPort;

    @Value("${jk.ftp.user}")
    private String ftpUser;

    @Value("${jk.ftp.pass}")
    private String ftpPass;

    @Value("${jk.ftp.path}")
    private String ftpUploadPath;

    private FTPClient ftpClient;

    private boolean connectServer(String ip,int port,String user,String pwd){

        ftpClient=new FTPClient();
        boolean succ =false;

        try {
            //连接 登录
            ftpClient.connect(ip, port);


            out.println("连接:"+ ftpClient.isConnected());

            succ = ftpClient.login(user,pwd);
            out.println("登录:"+ succ);

            int replyCode = ftpClient.getReplyCode();
            String replyString = ftpClient.getReplyString();
            System.out.println("Login failed. Reply code: " + replyCode + ", Reply string: " + replyString);

        } catch (IOException e) {
            e.printStackTrace();
        }

        return succ;
    }


    /**
     * 上传文件到ftp服务器
     * @param fileName 文件名
     * @param  file File文件
     * @return ftp服务器的文件地址+文件名
     */
    private  boolean uploadToFtp( String fileName, File file) throws IOException {
        boolean upload = false;
        FileInputStream fileInputStream = null;
        //connect to ftpServer
        if (connectServer(ftpIp, ftpPort, ftpUser, ftpPass)) {
            try { 
                // /etc/vsftpd/vsftpd.conf 中配置了 local_root=/home/ftpuser/ftpfile/
                // 这里目录如果不一致,文件将保存不了
                //ftpClient.changeWorkingDirectory(ftpUploadPath);
                ftpClient.setBufferSize(1024);
                ftpClient.setControlEncoding("UTF-8");
                ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
                ftpClient.enterLocalPassiveMode();


                //上传文件 参数:上传后的文件名,输入流
                upload = ftpClient.storeFile(fileName, new FileInputStream(file));
                out.println("结果:"+ upload);
            } catch (IOException e) {

                e.printStackTrace();
                upload = false;

            } finally {
                if(fileInputStream != null){fileInputStream.close();}
                ftpClient.disconnect();
            }
        }
        return upload;
    }


    /**
     * 上传文件到ftp服务器
     * @param filePath 文件路径
     * @param filename 文件名
     * @return ftp服务器的文件地址+文件名
     */
    public String uploadFileToFtp(String filePath, String filename) {

        File file = new File(filePath + filename);

        try {
            boolean result = uploadToFtp( filename, file);

            if (result) {
                out.println(filename + "上传至ftp服务器-成功!");
            } else {
                err.println(filename + "上传至ftp服务器-失败!");
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return getFtpUrl(filename);
    }

    private  String getFtpUrl( String newFileName) {


        return  newFileName;
//        return ftpUploadPath + newFileName;
    }


    //-------------------------------------


    /**
     * controller 接口测试使用
     * 上传文件到ftp服务器
     * @param fileList
     * @return
     * @throws Exception
     */
    public String uploadToFtp(MultipartFile[] fileList) throws Exception {

        //1、获取原文件后缀名
        MultipartFile multipartFile = fileList[0];
        String originalFileName = multipartFile.getOriginalFilename();
        String suffix = originalFileName.substring(originalFileName.lastIndexOf('.'));

        //2、使用UUID生成新文件名
        String newFileName = UUID.randomUUID() + suffix;

        //3、将MultipartFile转化为File
        File file =  multipartFileToFile(multipartFile);

        //4、上传至ftp服务器
        if (uploadToFtp( newFileName, file)) {
            out.println("上传至ftp服务器!");
        } else {
            out.println("上传至ftp服务器失败!");
        }
        return getFtpUrl( newFileName);
    }


    /**
     * MultipartFile 转 File
     * @param file MultipartFile
     * @return File
     * @throws Exception
     */
    public static File multipartFileToFile(MultipartFile file) throws Exception {

        File toFile = null;
        if (file.equals("") || file.getSize() <= 0) {
            file = null;
        } else {
            InputStream ins = null;
            ins = file.getInputStream();
            toFile = new File(file.getOriginalFilename());
            inputStreamToFile(ins, toFile);
            ins.close();
        }
        return toFile;
    }

    //获取流文件
    private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

补充:Linux 离线安装 ftp服务

下载地址:

bash 复制代码
https://developer.aliyun.com/packageSearch?word=vsftpd

或

https://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/


麒麟仓库地址

https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/base/aarch64/Packages/

安装命令

bash 复制代码
rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm

补充:ubuntu 离线安装 ftp服务

地址:

bash 复制代码
https://pkgs.org/download/vsftpd

安装:

bash 复制代码
sudo dpkg -i vsftpd*.deb
bash 复制代码
sudo vim /etc/vsftpd.conf

开启写

write_enable=YES

创建用户

bash 复制代码
sudo adduser 用户名

sudo adduser ftpuser

  随后会提示输入密码 :Userftp@123
相关推荐
海鸥8120 分钟前
在linux下,找到指定命令对应的路径信息
linux·运维·服务器
shyuu_25 分钟前
Linux 三种方式查看和设置主机名
linux·运维·服务器·正则表达式·云计算·运维开发
黑客大佬1 小时前
安全工具 | 使用Burp Suite的10个小tips
运维·前端·网络·学习·安全·云计算·腾讯云
啊呦.超能力1 小时前
Linux下进程间的通信--共享内存
linux·运维·服务器
一眼万里*e2 小时前
UE5 Linux编译流程(实战)
linux·ue5
勤劳兔码农2 小时前
使用Ansible进行多云环境的自动化部署与管理
运维·自动化·ansible
zjsnh_Z2 小时前
Linux 操作系统 进程(2)
linux·运维·服务器
雾岛LYC听风2 小时前
3. 轴指令(omron 机器自动化控制器)——>MC_Power&MC_MoveJog
运维·c#·自动化
only_print2 小时前
linux网络编程——UDP编程
linux·网络·嵌入式硬件
KookeeyLena42 小时前
动态ip切换频率是快点好还是慢点好
linux·网络·tcp/ip