idea配置FTP文件上传

news2024/11/16 2:28:49

idea配置FTP

在这里插入图片描述

连接测试

在这里插入图片描述

打开

在这里插入图片描述

工具拦打开

在这里插入图片描述

maven依赖

 <!-- FTP -->
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.8.0</version>
</dependency>

FTP-配置

/**
 * FTP-配置
 */
@Data
@RefreshScope
@ConfigurationProperties(prefix = "distribution")
public class EquityProperties {
    
    /**
     * FTP - IP地址
     */
    private String ftpIp;
    /**
     * FTP - 端口
     */
    private int ftpPort;
    /**
     * FTP - 路径
     */
    private String ftpPath;
    /**
     * FTP - 用户名
     */
    private String ftpUsername;
    /**
     * FTP - 密码
     */
    private String ftpPassword;
}

application.yml 配置

distribution:
  ftpIp: 127.0.0.1
  ftpPort: 21
  ftpPath: /xxxx
  ftpUsername: ftptest
  ftpPassword: ftptest

文件上传工具类

/**
 * FTP 文件上传
 *
 * @author Lance
 * @since 2024-08-26 12:16
 */
@Component
public class FTPClientUtil {
    private static final Logger logger = LoggerFactory.getLogger(FTPClientUtil.class);

    private static final FTPClient FTP_CLIENT = new FTPClient();

    @Resource
    private EquityProperties properties;

    /**
     * 初始化 FTP 客户端
     */
    private void initClient(int fileType) throws IOException {
        FTP_CLIENT.connect(properties.getFtpIp(), properties.getFtpPort());
        FTP_CLIENT.login(properties.getFtpUsername(), properties.getFtpPassword());

        int replyCode = FTP_CLIENT.getReplyCode();
        if (!FTPReply.isPositiveCompletion(replyCode)) {
            logger.error("FTP服务器拒绝连接。响应代码: {}", replyCode);
            return;
        } else {
            logger.info("已成功连接到FTP服务器.");
        }

        if (!FTP_CLIENT.login(properties.getFtpUsername(), properties.getFtpPassword())) {
            logger.error("FTP登录失败.");
            return;
        }
        FTP_CLIENT.enterLocalPassiveMode();
        FTP_CLIENT.setFileType(fileType);
    }


    /**
     * 上传文件内容到FTP服务器
     *
     * @param remoteDir      服务器目录
     * @param remoteFileName 文件名
     * @param fileContent    文件内容
     * @return true表示上传成功,false表示上传失败
     */
    public boolean uploadFileContent(String remoteDir, String remoteFileName, String fileContent) {
        try {
            initClient(FTP.BINARY_FILE_TYPE);

            String remoteDirPath = properties.getFtpPath() + "/" + remoteDir;

            // 检查远程目录是否存在,如果不存在,则创建它
            if (!remoteDirPath.isEmpty() && !FTP_CLIENT.changeWorkingDirectory(remoteDirPath)) {
                String[] dirs = remoteDirPath.split("/");
                String currentDir = "/";
                for (String dir : dirs) {
                    if (dir.isEmpty()) continue;
                    currentDir += dir + "/";
                    if (!FTP_CLIENT.changeWorkingDirectory(currentDir)) {
                        if (!FTP_CLIENT.makeDirectory(currentDir)) {
                            logger.error("无法创建目录: {}", currentDir);
                            return false;
                        }
                        FTP_CLIENT.changeWorkingDirectory(currentDir);
                    }
                }
            }

            // 上传前,检查目录是否存在以及我们是否有权限
            if (!FTP_CLIENT.changeWorkingDirectory(remoteDirPath)) {
                System.out.println("目录不存在或无法访问: " + remoteDirPath);
                return false;
            }

            // 上传文件内容
            InputStream input = new ByteArrayInputStream(fileContent.getBytes());
            boolean done = FTP_CLIENT.storeFile(remoteFileName, input);
            input.close();
            if (!done) {
                logger.error("上传文件失败。服务器响应: {}", FTP_CLIENT.getReplyString());
            } else {
                logger.info("文件上传成功.");
            }
            return done;
        } catch (IOException ex) {
            logger.error("发生IO异常: {}", ex.getMessage());
            return false;
        } finally {
            closeFtpClient();
        }
    }


    /**
     * 下载FTP服务器上的文件
     *
     * @param remoteFilePath 远程文件路径
     * @param localFilePath  本地文件路径
     * @return true表示下载成功,false表示下载失败
     */
    public boolean downloadFile(String remoteFilePath, String localFilePath) {
        try {
            initClient(FTP.BINARY_FILE_TYPE);

            try (OutputStream output = new FileOutputStream(localFilePath)) {
                boolean success = FTP_CLIENT.retrieveFile(remoteFilePath, output);
                if (success) {
                    logger.info("文件下载成功.");
                } else {
                    logger.info("下载文件失败.");
                }
                return success;
            }
        } catch (IOException ex) {
            logger.error("下载文件失败,失败原因:{}", ex.getMessage());
            return false;
        } finally {
            closeFtpClient();
        }
    }

    /**
     * 删除FTP服务器上的文件
     *
     * @param remoteFilePath 远程文件路径
     * @return true表示删除成功,false表示删除失败
     */
    public boolean deleteFile(String remoteFilePath) {
        try {
            initClient(FTP.BINARY_FILE_TYPE);

            boolean deleted = FTP_CLIENT.deleteFile(remoteFilePath);
            if (deleted) {
                logger.info("文件删除成功.");
            } else {
                logger.info("文件删除失败.");
            }
            return deleted;
        } catch (IOException ex) {
            logger.error("删除文件失败,失败原因:{}", ex.getMessage());
            return false;
        } finally {
            closeFtpClient();
        }
    }

    /**
     * 关闭FTP客户端连接
     */
    private void closeFtpClient() {
        if (FTPClientUtil.FTP_CLIENT.isConnected()) {
            try {
                FTPClientUtil.FTP_CLIENT.logout();
                FTPClientUtil.FTP_CLIENT.disconnect();
                logger.info("FTP客户端已关闭");
            } catch (IOException ex) {
                logger.error("FTP客户端关闭失败,失败原因:{}", ex.getMessage());
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2088618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字时代的内容安全治理:审核与管理的艺术

《互联网内容审核与信息安全管理》提供了全面实施互联网内容审核与信息安全管理的方法&#xff0c;主要包括三部分内容。 第一部分&#xff1a;阐释什么是互联网内容审核与信息安全管理&#xff0c;为什么要进行互联网内容审核与信息安全管理&#xff1b;重点分析互联网内容…

vs 项目.gitignore设置过滤某个文件夹无效

问题描述 项目使用tfs进行管理&#xff0c;在使用uniapp开发小程序的时候&#xff0c;每次vs中的更改都会出现99的更改&#xff0c;查看详情发现都是uniapp下面的unpackage文件夹下面的内容。原因是每次重新运行该下面的文件都会重新生成。后来在该项目下面的.gitignore中配置…

【Vue】Echart渲染数据时页面不显示内容

背景 做的一个对话交互的功能&#xff0c;根据后台返回的数据&#xff0c;渲染成Echart图表展示因为图表种类多&#xff0c;因此根据不同图表单独做了一个个vue组件&#xff0c;将数据根据展示类型传到这些子组件中进行渲染无论哪种图表&#xff0c;第一次展示时都能正常展示&…

2024实战指南:四款全免费的数据恢复工具盘点!

在这个数字化的时代里&#xff0c;数据的安全至关重要。如果一不小心删除或丢失了重要数据应该怎么办呢&#xff1f;这几个全免费的数据恢复工具可以帮你解决问题&#xff0c;亲测好用哦&#xff01; 第一款&#xff1a;福昕数据恢复 直达链接&#xff1a;www.pdf365.cn/foxi…

跨系统备忘录迁移有哪些方法?备忘录内容如何跨平台转移?

备忘录作为我们日常生活中常用的软件&#xff0c;帮助我们随时记录重要事项和灵感。然而&#xff0c;随着科技的发展&#xff0c;我们可能会更换不同系统的设备&#xff0c;这时就需要将备忘录内容进行迁移。特别是跨系统的迁移&#xff0c;往往让人感到不便。那么&#xff0c;…

探索挪车小程序源码开发:构建便捷社区生活的智慧桥梁

随着城市化进程的加速&#xff0c;车辆保有量不断增加&#xff0c;停车难、挪车难成为了许多城市居民日常生活中的一大痛点。为了解决这一难题&#xff0c;挪车小程序应运而生&#xff0c;它利用移动互联网的便捷性&#xff0c;为车主之间搭建起一个高效、便捷的沟通平台。本文…

【Python 千题 —— 基础篇】身份证隐藏的信息

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 在一个用户信息管理系统中,你需要处理和验证用户提供的身份证号。编写一个程序来从用户信息字符串中提取和验证身份证号,并提供相应的处理方式…

LLM论文研读: MindSearch

1. 背景 近日中科大与上海人工智能实验室联合推出的MindSearch思索&#xff0c;引起了不小的关注&#xff0c;github上的星标&#xff0c;短短几周时间&#xff0c;已经飙到了4.2K。看来确实有些内容&#xff0c;因此本qiang~研读了论文及代码&#xff0c;针对其中的原理与创新…

自动化测试的使用场景有哪些?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文将通过介绍 自动化测试是什么&#xff1f;哪些场景适用于自动化测试&#xff1f;自动化测试的好处&#xff1f;以及通过 具体的自动化测试工具应用实例来对自动…

【逐行注释】无迹卡尔曼滤波(UKF)的MATLAB代码,附下载链接

文章目录 程序组成部分部分代码及注释展示运行结果主要模块解读&#xff1a;运动模型绘图部分误差统计特性输出 下载链接 程序组成部分 由模型初始化、运动模型、UKF主体部分、绘图代码和输出部分组成&#xff1a; 部分代码及注释展示 运行结果 运行后可以得到三幅图和一段…

uniapp小程序怎么判断滑动的方向

项目场景&#xff1a; 获取手机上手指滑动的距离超过一定距离 来操作一些逻辑 解决方案&#xff1a; 在uniapp中&#xff0c;可以通过监听触摸事件来判断滑动的方向。常用的触摸事件包括touchstart, touchmove, 和 touchend。通过这些事件的参数&#xff0c;可以计算出用户的滑…

Java 入门指南:Java NIO —— Selector(选择器)

NIO 的引入 在传统的 Java I/O 模型&#xff08;BIO&#xff09;中&#xff0c;I/O 操作是以阻塞的方式进行的。当一个线程执行一个 I/O 操作时&#xff0c;它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈&#xff0c;因为需要为每个连接创建一…

随身wifi靠谱吗?适合哪类人使用?靠谱随身wifi怎么选?热门随身wifi推荐测评!

你真的适合用随身wifi吗&#xff1f; 户外工作者&#xff1a;外卖员&#xff0c;滴滴司机&#xff0c;卡车司机&#xff0c;户外直播等人群对于网络的稳定性和流量的需求还是比较高的。随身wifi便携&#xff0c;信号稳定&#xff0c;流量多性价比高的特点符合户外工作者对网络的…

制造企业看过来!这15款工程软件值得推荐!

本文将盘点15款工程软件&#xff0c;供企业选型参考。 工程软件就如同工程领域的得力助手&#xff0c;能让工程建设的各个环节都变得更加高效、精准。 对于工程企业来说&#xff0c;如果没有合适的工程软件&#xff0c;就像工匠没有趁手的工具&#xff0c;难以打造出精良的作品…

vmware典型安装centos

创建虚拟机 选择centos镜像 设置用户名

Oracle 网络安全产品安全认证检索

自2023年7月1日起&#xff0c;国家网信办、工业和信息化部、公安部、国家认证认可监督管理委员会统一公布和更新网络关键设备和网络安全专用产品清单。列入《网络关键设备和网络安全专用产品目录》的网络安全专用产品应当按照《信息安全技术网络安全专用产品安全技术要求》等相…

日本对COBOL的需求--一篇说清楚

关于COBOL&#xff08;Common Business-Oriented Language&#xff09;在中国和日本的使用情况&#xff0c;确实存在显著的差异。 在中国&#xff0c;COBOL被视为一种较早的编程语言&#xff0c;其使用范围和需求已经相对较小&#xff0c;这主要是由于技术更新和新一代编程语言…

【微信小程序入门】1、初识微信小程序

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

1. 【Java开发手册】| 前言

最早接触 《Java 开发手册》大概是 2020 年的时候&#xff0c;那个时候刚出** 嵩山版 **, 当时也就是大致扫了一遍&#xff0c;对于一些约定其实也不了解&#xff0c;并没有太在意。随着开发经验的积累&#xff0c;从当初埋头写业务的大头兵&#xff0c;到现在成为了一个带领小…

基于vue框架的餐馆管理系统jo0i7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,菜品分类,菜品信息,餐馆介绍,后厨,菜品订单,后厨接单,完成订单 开题报告内容 基于Vue框架的餐馆管理系统开题报告 一、研究背景与意义 随着餐饮行业的蓬勃发展&#xff0c;餐馆面临着日益激烈的市场竞争和消费者多样化的需求。传…