java上传、下载、预览、删除ftp服务器上的文件

简介: java上传、下载、预览、删除ftp服务器上的文件

1、添加依赖

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

2、在properties文件里配置ftp信息(初学者可以放在java类里):

ftp.url=192.168.60.48
ftp.port=21
ftp.username=FTPTest
ftp.password=FTPTest
ftp.path=E

3、代码:

package com.bosssoft.nontax.basicinfo.standard.sfml.domain;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

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

/**
 * @Description TODD
 * @Author sgw
 * @Date 2019/4/2
 * @Version 1.0
 **/
@Component
public class PdfUtilsByFtp {
   

     @Resource
     private FTPClient ftpClient;

     @Value("${ftp.url}")
     public String url;//ftpClient url

     @Value("${ftp.port}")
     public int port;//端口

     @Value("${ftp.username}")
     public String username;//登录用户名

     @Value("${ftp.password}")
     public String password;//登录密码

     @Value("${ftp.path}")
     public String path;//写入/上传文件路径

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

    Logger logger = LoggerFactory.getLogger(PdfUtilsByFtp.class);

    /**
     * Description: 向FTP服务器上传文件
     * @param filename 文件名
     * @param path  文件路径
     * @param input  输入流
     * @param url     ftp的地址
     * @param port    ftp的端口
     * @param username  ftp用户名
     * @param password  ftp密码
     * @throws IOException
     */
    public void uploadFile(String filename, String path, InputStream input, String url, int port, String username, String password) throws IOException {
   
        /*try {*/

        int reply;

        /**
         * 连接FTP服务器
         * 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
         */
        ftpClient.connect(url, port);
        //登录
        ftpClient.login(username, password);
        //ftp连接的返回码:200表示连接成功,其他值表示连接失败
        reply = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
   
            ftpClient.disconnect();
            logger.error("FTP上传文件还没开始就断开了");
        }
        /**
         * 这里修改为被动模式
         * 主动模式:客户端开放端口给服务端用;
         * 被动模式:服务端开放端口给客户端用。
         * 由于很多客户端在防火墙内,开放端口给服务器端用比较困难。所以用被动模式的时候比较多。
         */
        ftpClient.enterLocalPassiveMode();

        // 修改工作目录为path指定的目录
        workingDirectory(ftpClient, path);
        // ftpClient.changeWorkingDirectory(path);
        logger.info("FTP判断服务器的编码格式是UTF-8还是GBK");
        //查看服务器的编码格式是UTF-8还是GBK 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
        if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
   
            LOCAL_CHARSET = "UTF-8";
        }
        ftpClient.setControlEncoding(LOCAL_CHARSET);
        //ftp上传文件是以文本形式传输的,所以多媒体文件会失真,需要转为二进制形式传输
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        logger.info("FTP进行上传文件");
        //文件名字进行编码转换
        ftpClient.storeFile(utf8TOiso88591(filename, LOCAL_CHARSET), input);
        input.close();
        ftpClient.logout();
        if (ftpClient.isConnected()) {
   
            ftpClient.disconnect();
        }
    }
    public void workingDirectory(FTPClient ftp, String path) {
   
        try {
   
            //切换工作目录为根目录
            ftp.changeWorkingDirectory("/");

            if (StringUtils.isBlank(path) || path.equals("/")) {
   //如果输入的路径为空或者为根路径,则不转换操作目录

            } else {
   //否则创建想要上传文件的目录,并且将操作目录转为新创建的目录
                //循环创建多级目录
                String directory = path.substring(0, path.lastIndexOf("/") + 1);
                if (!directory.equalsIgnoreCase("/") && !ftpClient.changeWorkingDirectory(new String(directory.getBytes("GBK"), "iso-8859-1"))) {
   
                    // 如果远程目录不存在,则递归创建远程服务器目录
                    int start = 0;
                    int end = 0;
                    if (directory.startsWith("/")) {
   
                        start = 1;
                    } else {
   
                        start = 0;
                    }
                    end = directory.indexOf("/", start);
                    while (true) {
   
                        String subDirectory = new String(path.substring(start, end).getBytes("GBK"),
                                "iso-8859-1");
                        if (!ftpClient.changeWorkingDirectory(subDirectory)) {
   
                            if (ftpClient.makeDirectory(subDirectory)) {
   
                                ftpClient.changeWorkingDirectory(subDirectory);

                            } else {
   
                                System.out.println("创建目录失败");
                            }
                        }
                        start = end + 1;
                        end = directory.indexOf("/", start);
                        // 检查所有目录是否创建完毕
                        if (end <= start) {
   
                            break;
                        }
                    }
                }
                //这个创建目录的函数只能创建一级目录,不能创建多级目录
                //boolean b = ftp.makeDirectory(gbkTOiso88591(path));
                //切换当前的工作目录为新建的目录
                ftp.changeWorkingDirectory(gbkTOiso88591(path));
            }
        } catch (Exception e) {
   
            logger.error("FTP上传文件进行创建目录结构的时候出现了异常:" + e.getMessage());
        }
    }

    public String utf8TOiso88591(String filename, String codestyle) {
   
        try {
   
            return new String(filename.getBytes(codestyle), "iso-8859-1");
        } catch (Exception e) {
   
            logger.error("FTP上传文件进行" + codestyle + "转ISO-8859-1的时候出现了异常:" + e.getMessage() + "返回的结果就还是传进来的参数");
            logger.error("FTP上传文件进行" + codestyle + "转ISO-8859-1的时候出现了异常,返回的结果就还是传进来的参数");
            return filename;
        }
    }

    public String gbkTOiso88591(String path) {
   
        try {
   
            return new String(path.getBytes("GBK"), "iso-8859-1");
        } catch (Exception e) {
   
            logger.error("FTP上传文件进行GBK转ISO-8859-1的时候出现了异常:" + e.getMessage());
            logger.error("FTP上传文件进行GBK转ISO-8859-1的时候出现了异常,返回的结果就还是传进来的参数");
            return path;
        }
    }

    public FTPClient getFtpClient() {
   
        return ftpClient;
    }

    public void setFtpClient(FTPClient ftpClient) {
   
        this.ftpClient = ftpClient;
    }

    /**
     * Description: 删除ftp上的文件
     * @param url     ftp的地址
     * @param port    ftp的端口
     * @param username  ftp用户名
     * @param password  ftp密码
     * @param filePath  文件路径(后边跟上了文件名)
     * @throws IOException
     */
    public void deleteFile(String url, int port, String username, String password, String filePath) throws IOException {
   
        int reply;
        ftpClient.connect(url, port);
        //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
        ftpClient.login(username, password);
        reply = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
   
            ftpClient.disconnect();
            logger.error("FTP断开了");
        }
        //修改为被动模式
        ftpClient.enterLocalPassiveMode();
        //删除文件
        ftpClient.deleteFile(filePath);
    }
    /**
     * Description: 下载/浏览器预览  需要的流信息
     * @param url     ftp的地址
     * @param port    ftp的端口
     * @param username  ftp用户名
     * @param password  ftp密码
     * @param filePath  文件路径(后边跟上了文件名)
     * @throws IOException
     */
    public InputStream getStream(String url, int port, String username, String password, String filePath) throws IOException {
   
        int reply;
        ftpClient.connect(url, port);//连接FTP服务器
        //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
        ftpClient.login(username, password);//登录
        reply = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
   
            ftpClient.disconnect();
            logger.error("FTP断开了");
        }
        InputStream inputStream = ftpClient.retrieveFileStream(filePath);
        return inputStream;
    }
}

注意:由于PdfUtilsByFtp类需要加载配置文件里的信息,所以,引用PdfUtilsByFtp类的时候需要用注入的方式,不能new,即:

    @Autowired
    private PdfUtilsByFtp fdfUtilsByFtp;
相关文章
|
3月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
218 1
|
6月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
327 14
|
7月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
371 18
|
6月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
175 0
|
7月前
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
539 5
|
6月前
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
479 0
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
3174 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
7月前
|
网络协议 安全 Java
实现Java语言的文件断点续传功能的技术方案。
像这样,我们就完成了一项看似高科技、实则亲民的小工程。这样的技术实现不仅具备实用性,也能在面对网络不稳定的挑战时,稳稳地、不失乐趣地完成工作。
452 0
|
10月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
11月前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。