Java 使用FTP上传文件 并 模拟接受

0. 导入相关依赖

<!-- FTP -->
<dependency>
     <groupId>commons-net</groupId>
     <artifactId>commons-net</artifactId>
     <version>3.6</version>
 </dependency>
 <!-- Hutool:一个小而全的Java工具类库,具体介绍参照附录1 -->
 <dependency>
     <groupId>cn.hutool</groupId>
     <artifactId>hutool-all</artifactId>
     <version>5.3.7</version>
 </dependency>
 <!-- lombok:通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,需要为idea添加插件,添加方法参照附录2 -->
 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <version>1.18.16</version>        
  </dependency>

1. 文件上传代码

@Component
@Slf4j
public class FTPTools {

    /**
     * 文件上传
     * @param hostname 域名地址
     * @param port 端口号
     * @param username 用户名
     * @param password 密码
     * @param fileInfo 待上传的文件
     * @param uploadPath 待上传到的路径
     * @param saveName 预保存的文件名
     * @return
     */
    public static boolean upload(String hostname,int port,String username,String password,String fileInfo,String uploadPath,String saveName){
        boolean flag = false;

        FTPClient ftpClient = null;
        try {
            ftpClient = new FTPClient();
            ftpClient.connect(hostname,port);
            //每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据
            ftpClient.enterLocalPassiveMode();
            //设置二进制传输
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.setControlEncoding("UTF-8");
            if(ftpClient.login(username,password)){//若连接成功
                log.info("成功登录到ftp服务端,开始文件上传");
                flag = sendFile(ftpClient,fileInfo,uploadPath,saveName);
            }else{
                log.error("登录到ftp服务端失败,请检查用户名和密码");
            }
            disconnect(ftpClient);
        }catch (SocketException e) {
            log.error("文件{}上传失败:{}",saveName,e.getMessage());
        } catch (IOException e) {
            log.error("文件{}上传失败:{}",saveName,e.getMessage());
        } finally {

        }
        return flag;
    }

    /**
     * 文件传输
     * @param fileInfo
     * @param uploadPath
     * @param saveName
     * @return
     */
    private static boolean sendFile(FTPClient ftpClient, String fileInfo, String uploadPath, String saveName) throws FileNotFoundException,IOException{
        boolean flag = false;
        try(FileInputStream fileInputStream = new FileInputStream(fileInfo)){
            //检查工作目录是否存在
            if(ftpClient.changeWorkingDirectory(uploadPath)){
            	if(ftpClient.listFiles(saveName).length != 0){ //检查文件是否已经存在
                    boolean deleteFlag = ftpClient.deleteFile(saveName);
                    log.info(deleteFlag?"文件已存在,直接删除":"存在同名文件且无法删除,请检查权限");
                }
                flag = ftpClient.storeFile(saveName,fileInputStream);
                log.info(flag?"文件上传成功!":"文件上传失败!");
            }else{
                log.error("找不到要上传的目录");
            }
        }catch (FileNotFoundException e){
            log.error("找不到要上传的文件{}:{}",fileInfo,e.getMessage());
            throw e;
        }catch (IOException e){
            log.error("文件传输异常:{}",e.getMessage());
            throw e;
        }
        return flag;
    }

    /**
     * 断开ftp连接
     * @param ftpClient
     */
    private static void disconnect(FTPClient ftpClient) {
        if (ftpClient.isConnected()){
            try{
                ftpClient.disconnect();
                log.info("ftp连接已关闭,文件上传结束");
            }catch (IOException e){
                log.error("ftp连接关闭失败:{}",e);
            }
        }
    }

}

2. FTP模拟测试环境搭建

通过FileZilla安装模拟环境:

a. 打开FileZilla的下载中心,下载服务器

java 查询FTP文件权限 java获取ftp文件_java 查询FTP文件权限


b. 选择合适的版本后,直接傻瓜式安装

c. 配置相关数据

相关操作流程如下:

java 查询FTP文件权限 java获取ftp文件_intellij idea_02

编辑—>用户
用户名和密码粗略设置如下图所示

java 查询FTP文件权限 java获取ftp文件_ftp_03


通过FTP上传到的文件位置可按个人情况进行设置,勾选相关权限


java 查询FTP文件权限 java获取ftp文件_java_04


以上配置即可满足测试要求,进一步的东西大家可根据需求自行研究,也欢迎留言交流!

3. 测试代码

//ftp配置信息
    String hostname = "127.0.0.1"; //域名地址
    int port = 21; //端口号
    String username = "lmh"; //用户名
    String password = "123456"; //密码
    String fileInfo = "E:\\Temporary\\1.file"; //待上传的文件目录
    String uploadPath = "/"; //待上传到的路径
    String saveName = FTP+ "_" + DateUtil.format(new Date(),"yyyyMMdd"); //预保存的文件名
    FTPTools.upload(hostname, port, username, password, fileInfo, uploadPath, saveName);

4. 测试效果

java 查询FTP文件权限 java获取ftp文件_intellij idea_05

附录1 :Hutool

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;

Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。
就比如

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String date = sdf.format(new Date());

可以通过Hutool简化为

String date = DateUtil.format(new Date(),"yyyyMMdd");

类似的例子很多大家可以自己去官网看,文档清晰明了:https://www.hutool.cn/docs/#/

附录2:IntelliJ IDEA lombok插件的安装和使用

https://jingyan.baidu.com/article/0a52e3f4e53ca1bf63ed725c.html