springboot做一个简单的ftp功能

这篇博客记录了如何使用SpringBoot实现FTP文件上传和下载功能,包括配置pom.xml依赖,设置yml文件中的FTP连接参数,创建FTPUtils工具类以及FtpController控制器。博主提醒需要开启FTP服务并设置用户密码登录,控制器中提供了上传和下载的方法,并给出了注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录做完一个简单的ftp功能:

pom依赖:

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

yml:
#ftp
FTP:
port: 21
ftpHost: 192.168.1.126
ftpUserName: fanyusong
ftpPassword: 123456
ftpPath: /

ftputils:
package com.ejkj.common.util;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.*;
import java.net.SocketException;

@Component
public class FTPUtils {
private static final Logger logger = LoggerFactory.getLogger(FTPUtils.class);

/**
 * 获取FTPClient对象
 *
 * @param ftpHost     FTP主机服务器
 * @param ftpPassword FTP 登录密码
 * @param ftpUserName FTP登录用户名
 * @param ftpPort     FTP端口 默认为21
 * @return
 */
public static FTPClient getFTPClient(String ftpHost, String ftpUserName,
                                     String ftpPassword, int ftpPort) {
    FTPClient ftpClient = new FTPClient();
    try {
        ftpClient = new FTPClient();
        ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
        ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
        if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
            System.out.println("未连接到FTP,用户名或密码错误。");
            ftpClient.disconnect();
        } else {
            System.out.println("FTP连接成功。");
        }
    } catch (SocketException e) {
        e.printStackTrace();
        System.out.println("FTP的IP地址可能错误,请正确配置。");
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("FTP的端口错误,请正确配置。");
    }
    return ftpClient;
}

/*
 * 从FTP服务器下载文件
 *
 * @param ftpHost FTP IP地址
 * @param ftpUserName FTP 用户名
 * @param ftpPassword FTP用户名密码
 * @param ftpPort FTP端口
 * @param ftpPath FTP服务器中文件所在路径 格式: ftptest/aa
 * @param localPath 下载到本地的位置 格式:H:/download
 * @param fileName 文件名称
 */
public static void downloadFtpFile(String ftpHost, String ftpUserName,
                                   String ftpPassword, int ftpPort, String ftpPath, String localPath,
                                   String fileName) {

    FTPClient ftpClient = null;

    try {
        ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
        ftpClient.setControlEncoding("UTF-8"); // 中文支持
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        ftpClient.enterLocalPassiveMode();
        ftpClient.changeWorkingDirectory(ftpPath);

        File localFile = new File(localPath + File.separatorChar + fileName);
        OutputStream os = new FileOutputStream(localFile);
        ftpClient.retrieveFile(fileName, os);
        os.close();
        ftpClient.logout();

    } catch (FileNotFoundException e) {
        System.out.println("没有找到" + ftpPath + "文件");
        e.printStackTrace();
    } catch (SocketException e) {
        System.out.println("连接FTP失败.");
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("文件读取错误。");
        e.printStackTrace();
    }

}

/**
 * Description: 向FTP服务器上传文件
 * @param ftpHost FTP服务器hostname
 * @param ftpUserName 账号
 * @param ftpPassword 密码
 * @param ftpPort 端口
 * @param ftpPath  FTP服务器中文件所在路径 格式: ftptest/aa
 * @param fileName ftp文件名称
 * @param input 文件流
 * @return 成功返回true,否则返回false
 */
public static boolean uploadFile(String ftpHost, String ftpUserName,
                                 String ftpPassword, int ftpPort, String ftpPath,
                                 String fileName,InputStream input) {
    boolean success = false;
    FTPClient ftpClient = null;
    try {
        int reply;
        ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
        reply = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftpClient.disconnect();
            return success;
        }
        ftpClient.setControlEncoding("UTF-8"); // 中文支持
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        ftpClient.enterLocalPassiveMode();
        ftpClient.changeWorkingDirectory(ftpPath);

        ftpClient.storeFile(fileName, input);

        input.close();
        ftpClient.logout();
        success = true;
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
            } catch (IOException ioe) {
            }
        }
    }
    return success;
}

}

controller:(只简单的实现绝对路径上传下载,后续改进为相对路径)
package com.ejkj.core.controller;

import com.ejkj.common.util.FTPUtils;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.net.ftp.FTPClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.UUID;

@RestController
@RequestMapping("/ftp")
public class FtpController {

@Autowired
private FTPUtils ftpUtils;


@ApiOperation(value = "ftp上传", notes = "ftp上传")
@PostMapping("/upfile")
public Boolean Upload(MultipartFile file) throws Exception {
    String newName = UUID.randomUUID().toString();
    String oldName = file.getOriginalFilename();
    newName = newName + oldName.substring(oldName.lastIndexOf("."));
    InputStream inputStream = file.getInputStream();

    return ftpUtils.uploadFile( "192.168.1.126",  "fanyusong","123456",  21,"/ftp文件夹",oldName, inputStream);
}


@ApiOperation(value = "ftp下载", notes = "ftp下载")
@GetMapping("/downfile")
public void Download(HttpServletResponse response) throws Exception {

        ftpUtils.downloadFtpFile("192.168.1.126", "fanyusong","123456",21,"/ftp文件夹","F:/FTPDownload", "tes t1.txt");
    }

}

注意:
1.需要在本地开启ftp热点,并设置权限为基本用户密码登录(我也不知道为什么匿名不能连接)
2.在网上查下设置为用户密码登录本地ftp,controller填写基本用户名和密码就可连接
3.其中ftpPath是目标ftp文件夹,"/“代表指定ftp根路径,要访问它的下一级则在”/"加上文件夹或者文件名用于测试
4.localPath是下载到本地的路径,就是设置本地的下载路径,需要在本地选择合适文件夹用于存放ftp上下载的东西
5.上传成功返回true,代表连接且上传成功
6.下载后在localPath下找到下载的文件则连接且下载成功
越专注越快乐!加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值