springboot 通过ftp 上传文件

1. 服务器安装ftp服务

1.1 Linux 安装ftp服务器

yum -y install vsftpd

(离线安装 ——见 文末 )

关闭SELINUX    /// 非必要项
修改/etc/selinux/config文件,把SELINUX参数的值改为disabled。
SELINUX =disabled

启动vsftpd服务

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

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

1.2 新建账户,root 被限制

创建用户:
useradd ftpuser 

设置密码:
passwd ftpuser 

密码:Userftp@123

2. 创建文件目录

创建目录

mkdir /home/ftpuser/ftpfile

赋权


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


#连接端口 默认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. 防火墙开放端口

 systemctl status firewalld 

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

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

 systemctl start firewalld 


5. 连接测试


# 下载文件
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.代码编写


        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.9.0</version>
        </dependency>

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/


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服务

下载地址:

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/

 安装命令

rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm

补充:ubuntu 离线安装 ftp服务

地址:

https://pkgs.org/download/vsftpd

安装:

sudo dpkg -i vsftpd*.deb

sudo vim /etc/vsftpd.conf

开启写

write_enable=YES

创建用户

sudo adduser 用户名

sudo adduser ftpuser

  随后会提示输入密码 :Userftp@123
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Apache Commons Net库来实现FTP上传文件到服务器,以下是一个简单的示例代码: ```java import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.springframework.stereotype.Service; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @Service public class FtpService { private final String FTP_HOST = "ftp.example.com"; private final String FTP_USERNAME = "username"; private final String FTP_PASSWORD = "password"; private final int FTP_PORT = 21; public void uploadFile(File file, String remotePath, String fileName) throws IOException { FTPClient ftpClient = new FTPClient(); try { ftpClient.connect(FTP_HOST, FTP_PORT); ftpClient.login(FTP_USERNAME, FTP_PASSWORD); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.changeWorkingDirectory(remotePath); FileInputStream inputStream = new FileInputStream(file); boolean done = ftpClient.storeFile(fileName, inputStream); inputStream.close(); if (done) { System.out.println("文件上传成功"); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (ftpClient.isConnected()) { ftpClient.logout(); ftpClient.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } } } ``` 说明: 1. `FTP_HOST`、`FTP_USERNAME`、`FTP_PASSWORD`、`FTP_PORT`分别为FTP服务器的地址、用户名、密码、端口号。 2. `uploadFile`方法接收一个`File`类型的文件、一个远程路径和一个文件名,将文件上传到指定的路径下。 3. 使用`FTPClient`连接FTP服务器,设置传输方式为二进制类型,使用`storeFile`方法上传文件,最后关闭连接。 需要注意的是,在使用`FTPClient`时,需要正确处理异常。同时,为了安全起见,建议将FTP的用户名和密码存储在配置文件中,而不是写在代码中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值