Java实现FTP上传与下载功能

 更新时间:2022年02月22日 15:45:04   作者:hehuijava  
这篇文章主要为大家详细介绍了Java实现FTP上传与下载功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Java实现FTP上传与下载的具体代码,供大家参考,具体内容如下

JAVA操作FTP服务器,只需要创建一个FTPClient即可,所有的操作都封装在FTPClient中,JDK自带的有FTPClient(sun.net.ftp.FtpClient),也可以用第三方的FTPClient,一般使用apache的FTPClient(org.apache.commons.net.ftp.FTPClient),本文将使用apache的FTPClient,API都大同小异

关键依赖:commons-net

对常用操作(上传、下载)封装成工具类

package com.day0322;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * FTP工具类
 * 文件上传
 * 文件下载
 */
public class FTPUtil {

    private static final Logger log = LoggerFactory.getLogger(FTPUtil.class);

    /**
     * 设置缓冲区大小4M
     **/
    private static final int BUFFER_SIZE = 1024 * 1024 * 4;

    /**
     * 本地字符编码
     **/
    private static String LOCAL_CHARSET = "GBK";

    /**
     * UTF-8字符编码
     **/
    private static final String CHARSET_UTF8 = "UTF-8";

    /**
     * OPTS UTF8字符串常量
     **/
    private static final String OPTS_UTF8 = "OPTS UTF8";

    /**
     * FTP协议里面,规定文件名编码为iso-8859-1
     **/
    private static final String SERVER_CHARSET = "ISO-8859-1";

    private static FTPClient ftpClient = null;

    /**
     * 连接FTP服务器
     */
    private static void login(OaFtp oaFtp) {
        ftpClient = new FTPClient();
        try {
            ftpClient.connect(oaFtp.getIp(), Integer.valueOf(oaFtp.getPort()));
            ftpClient.login(oaFtp.getName(), oaFtp.getPwd());
            ftpClient.setBufferSize(BUFFER_SIZE);
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            int reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                closeConnect();
            }
        } catch (Exception e) {
            log.error("",e);
            throw new RuntimeException(e);
        }
    }

    /**
     * 关闭FTP连接
     */
    private static void closeConnect() {
        if (ftpClient != null && ftpClient.isConnected()) {
            try {
                ftpClient.logout();
                ftpClient.disconnect();
            } catch (IOException e) {
                log.error("",e);
            }
        }
    }

    /**
     * FTP服务器路径编码转换
     *
     * @param ftpPath FTP服务器路径
     * @return String
     */
    private static String changeEncoding(String ftpPath) {
        String directory = null;
        try {
            if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(OPTS_UTF8, "ON"))) {
                LOCAL_CHARSET = CHARSET_UTF8;
            }
            directory = new String(ftpPath.getBytes(LOCAL_CHARSET), SERVER_CHARSET);
        } catch (Exception e) {
            log.error("",e);
        }
        return directory;
    }

    /**
     * 改变工作目录
     * 如果没有,则创建工作目录
     * @param path
     */
    private static void changeAndMakeWorkingDir(String path) {
        try {
            ftpClient.changeWorkingDirectory("/");
            path = path.replaceAll("\\\\","/");
            String[] path_array = path.split("/");
            for (String s : path_array) {
                boolean b = ftpClient.changeWorkingDirectory(s);
                if (!b) {
                    ftpClient.makeDirectory(s);
                    ftpClient.changeWorkingDirectory(s);
                }
            }
        } catch (IOException e) {
            log.error("",e);
            throw new RuntimeException(e);
        }
    }

    /**
     * 上传
     * @param oaFtp
     * @param filename
     * @param dirPath
     * @param in
     * @return
     */
    public static boolean upload (OaFtp oaFtp, String filename, String dirPath, InputStream in) {
        login(oaFtp);
        if (!ftpClient.isConnected()) {
            return false;
        }
        boolean isSuccess = false;

        if (ftpClient != null) {
            try {
                if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(OPTS_UTF8, "ON"))) {
                    LOCAL_CHARSET = CHARSET_UTF8;
                }
                ftpClient.setControlEncoding(LOCAL_CHARSET);
                String path = changeEncoding(dirPath);

                changeAndMakeWorkingDir(path);
                isSuccess = ftpClient.storeFile(new String(filename.getBytes(), SERVER_CHARSET), in);
            } catch (Exception e) {
                log.error("",e);
            } finally {
                closeConnect();
            }
        }
        return isSuccess;
    }

    /**
     * 下载
     * @param oaFtp
     * @param filename
     * @param dirPath
     * @param out
     * @return
     */
    public static void download (OaFtp oaFtp, String filename, String dirPath, FileOutputStream out) {
        // 登录
        login(oaFtp);
        if (ftpClient != null) {
            try {
                String path = changeEncoding(dirPath);
                changeAndMakeWorkingDir(path);
                String[] fileNames = ftpClient.listNames();
                if (fileNames == null || fileNames.length == 0) {
                    return;
                }
                for (String fileName : fileNames) {
                    String ftpName = new String(fileName.getBytes(SERVER_CHARSET), LOCAL_CHARSET);
                    if (StringUtils.equals(ftpName,filename)) {
                        InputStream in = ftpClient.retrieveFileStream(fileName);
                        IOUtils.copy(in,out);
                    }
                }
            } catch (IOException e) {
                log.error("",e);
            } finally {
                closeConnect();
            }
        }
    }
}

测试

1.上传

2.下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java中replaceAll替换圆括号实例代码

    java中replaceAll替换圆括号实例代码

    正则表达式的保留字符主要有:圆括号、方括号、花括号、竖线、横线、点号、加号、星号、反斜杆等等,下面这篇文章主要给大家介绍了关于java中replaceAll替换圆括号的相关资料,需要的朋友可以参考下
    2022-10-10
  • Java设计模式单例模式(Singleton)用法解析

    Java设计模式单例模式(Singleton)用法解析

    这篇文章主要介绍了Java设计模式单例模式(Singleton)用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java中synchronized用法汇总

    Java中synchronized用法汇总

    使用 synchronized 无需手动执行加锁和释放锁的操作,我们只需要声明 synchronized 关键字就可以了,JVM 层面会帮我们自动的进行加锁和释放锁的操作,我们今天重点来看一下synchronized 的几种用法
    2022-04-04
  • 如何为Spark Application指定不同的JDK版本详解

    如何为Spark Application指定不同的JDK版本详解

    这篇文章主要给大家介绍了关于如何为Spark Application指定不同的JDK版本的相关资料,文中通过示例代码将解决的方法介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友下面来随着小编一起学习学习吧。
    2017-11-11
  • java轻量级规则引擎easy-rules使用介绍

    java轻量级规则引擎easy-rules使用介绍

    这篇文章主要介绍了java轻量级规则引擎easy-rules使用介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java非递归实现删除任意目录的方法

    Java非递归实现删除任意目录的方法

    这篇文章主要为大家详细介绍了Java非递归实现删除任意目录的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Spring中的Actuator使用详解

    Spring中的Actuator使用详解

    这篇文章主要介绍了Spring中的Actuator使用详解,在生产环境中运行的程序,并不总是稳定、安静、正确的,往往会遇到各式各样的现场状况,这个时候,就需要获取该程序足够多的运行状态信息,然后分析并对其进行有效管理,需要的朋友可以参考下
    2023-09-09
  • 关于JWT之token令牌认证登录

    关于JWT之token令牌认证登录

    这篇文章主要介绍了关于JWT之token令牌认证登录,使用JWT能够保证Token的安全性,且能够进行Token时效性的检验,使用JWT时,登录成功后将用户信息生成一串令牌字符串,需要的朋友可以参考下
    2023-05-05
  • Java实现视频时间维度剪切的工具类

    Java实现视频时间维度剪切的工具类

    这篇文章主要为大家详细介绍了将视频按照时间维度进行剪切的Java工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • SpringBoot集成JPA的示例代码

    SpringBoot集成JPA的示例代码

    本篇文章主要介绍了SpringBoot集成JPA的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01

最新评论