首页 > 编程语言 >java上传文件到FTP制定文件夹

java上传文件到FTP制定文件夹

时间:2024-03-15 17:22:56浏览次数:30  
标签:FTP java String 文件夹 File import ftpClient

JAVA 上传文件到FTP

/**
 * @ClassName FTPLoad
 * @Description TODO
 * @Author dell
 * @Date 2024/3/14 15:56
 * @Version 1.0
 **/
import cn.hutool.core.io.FileUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class FTPUpload {

    public static void main(String[] args) {
        String projectRoot = System.getProperty("user.dir");
        String filePath = Paths.get(projectRoot, "config/application3ke.json").toString();


        JSONObject obj=JSONUtil.parseObj(readJson(filePath));
        String server = obj.getStr("server");
        int port = obj.getInt("port");
        String user = obj.getStr("username");
        String password = obj.getStr("password");
        String localBase = obj.getStr("localBase");//本地预处理文件夹路径
        String saveBackupFile = obj.getStr("saveBackupFile");//预处理文件处理结束后的备份保存路径
        String remoteDirectoryPath = obj.getStr("remoteDirectoryPath");//远程FTP文件夹路径

        File dir1 = new File(localBase);
        File[] dirs = dir1.listFiles();


        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.connect(server, port);
            ftpClient.login(user, password);
            ftpClient.enterLocalPassiveMode();
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            ftpClient.setBufferSize(1024000);
            if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(
                    "OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
                ftpClient.setControlEncoding("UTF-8");
            }else {
                ftpClient.setControlEncoding("GBK");
            }
            if (dirs!=null){
                //
                for (File dir : dirs) {//变量文件夹
                    System.out.println(dir.getName());
                    if (dir.isDirectory()) {
                        File dir2 = new File(dir.getPath());//取到二级目录
                        File[] files = dir2.listFiles();
                        String remoteDirectoryPathchange=remoteDirectoryPath+dir.getName();
                        ftpClient.changeWorkingDirectory(new String(remoteDirectoryPathchange.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));

                        for (File file : files){

                            File localFile = new File(file.getPath());
                            FileInputStream inputStream = new FileInputStream(localFile);

                            String remoteFilePath =  localFile.getName();
                            boolean uploaded = ftpClient.storeFile(new String(remoteFilePath.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1), inputStream);
                            inputStream.close();

                            if (uploaded) {
                                String targetFolderPath=saveBackupFile+dir.getName();
                                //将该文件移动到saveBackFile文件夹下面
                                moveFile(file.getPath(),targetFolderPath);
                                System.out.println("File uploaded successfully to: " + remoteFilePath);
                            } else {
                                System.out.println("Failed to upload file.");
                            }

                        }

                    }
                }
            }


        } catch (IOException ex) {
            System.out.println("Error: " + ex.getMessage());
            ex.printStackTrace();
        } finally {
            try {
                if (ftpClient.isConnected()) {
                    ftpClient.logout();
                    ftpClient.disconnect();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
    public static void moveFile(String sourceFilePath, String targetFolderPath) {
        // 创建源文件路径对象和目标文件夹路径对象
        Path sourcePath = Paths.get(sourceFilePath);
        Path targetPath = Paths.get(targetFolderPath);

        // 检查目标文件夹是否存在,如果不存在则创建
        if (!Files.exists(targetPath)) {
            try {
                Files.createDirectories(targetPath);
                System.out.println(targetPath+"目标文件夹不存在,已创建。");
            } catch (IOException e) {
                System.err.println("无法创建目标文件夹: " + e.getMessage());
                return;
            }
        }

        try {
            // 移动文件到目标文件夹-覆盖式
            Files.move(sourcePath, targetPath.resolve(sourcePath.getFileName()), StandardCopyOption.REPLACE_EXISTING);

            System.out.println("文件移动成功!");
        } catch (IOException e) {
            System.err.println("文件移动失败: " + e.getMessage());
        }
    }

    public static JSONObject readJson(String jsonFilePath){
        // 指定 JSON 文件路径
        JSONObject jsonObject=new JSONObject();
        try {
            // 读取 JSON 文件内容为字符串
            String jsonString = FileUtil.readString(jsonFilePath, Charset.defaultCharset());

            // 使用 Hutool 的 JSONUtil 解析 JSON 字符串
            jsonObject = JSONUtil.parseObj(jsonString);


        } catch (Exception e) {
            e.printStackTrace();
        }
        return jsonObject;
    }
}

标签:FTP,java,String,文件夹,File,import,ftpClient
From: https://www.cnblogs.com/hcxss/p/18075872

相关文章

  • javabean:VO和POJO的区别?
    实体类都是JavaBean的一种 实际上没区别 功能都一样 使用的时候区别(VO一般在命名结尾有大写VO 以做区别)参考:https://blog.csdn.net/huang_ftpjh/article/details/90232922关于java的几种对象(PO,VO,DAO,BO,POJO,DTO)解释摘抄参考2:https://blog.csdn.net/weixin_6938139......
  • idea开发java必备插件
    1.Lombok 这个大家都熟悉,通过注解的形式代替了很多生成式的代码,如Getter、Setter方法、ToString方法,构造函数等,使你的类更精简和美观,没有太多的冗余代码。2.Maven Helper,使用maven引入依赖的必备,分析和排除冲突依赖关系的简单方法,显示maven依赖树,查询引用的依赖关系以及跳转......
  • Java题目-数组计算-中位数- 圆类的构造-时间计算-学生类设计
    第一题:数组计算题目描述:编写Java程序,计算两个整型数组的和、差、乘积、商的整数部分及大小关系。定义如下:和:两个数组对应元素的和,若元素缺失,则补0;差:第一个数组和第二个数组对应元素的差,若元素缺失,则补0;乘积:两个数组对应元素的积,若元素缺失,则计0;除:第一个数组元素除以第二......
  • Mac下配置Java开发环境以Java 8 为例
    下面以Java8的安装和配置为例。Step1:下载Java安装包系统:MACOSX10.10.1Java8安装包:jdk-8u31-macosx-x64.dmgStep2:安装并配置Java环境:(1)打开Shell输入vi~/.bash_profile(2)i>输入>esc>:wq保存JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Conte......
  • Java-InputStream转Base64
    首先定义实体对象/***图片数据封装*/@DatapublicclassPgNewImageDto{/***文件类型*/privateStringfileType;/***文件数据*/privateStringfileData;}转换实现/***输入流转换为实体对象*@param......
  • 卡码java基础课 | 13.链表的基础操作I
    学习内容:链表基础重点归纳:见例题例题:解:点击查看代码importjava.util.Scanner;//定义链表classLinkedList{//定义链表中的链表节点publicstaticclassNode{intdata;//数据Nodenext;//指针publicNode(intdata){/......
  • Write failed: Broken pipe > Couldn‘t read packet: Connection reset by peer SFTP
    如果你链接服务器的时候出现下面的提示:Writefailed:BrokenpipeCouldn’treadpacket:Connectionresetbypeer这个问题的原因是ChrootDirectory的权限问题,你设定的目录必须是root用户所有,否则就会出现问题。所以请确保sftp用户根目录的所有人是root,权限是750或者755。......
  • Java面向对象的一些学习笔记
    1.Private关键字:(1)private关键字是一个权限修饰符(2)可以修饰成员变量和成员方法(3)被private修饰的成员只能在本类中才能访问(4)针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作(5)提供"setXxx(参数)"方法,用于给成员变量赋值,方法用public修饰(6)提供"getXxx(参数)......
  • Java学习笔记——第十六天
    集合进阶(二)Collection的其他相关知识前置知识:可变参数就是一种特殊形参,定义在方法、构造器的形参列表里,格式是:数据类型...参数名称。特点可以不传数据给它;可以传一个或者同时传多个数据给它;也可以传一个数组给它。作用常常用来灵活地接收数据。注意事项可变参数在方法......
  • Java IO流之Netty实现聊天通信功能
    目录1Netty1.1概要设计1.1.1技术选型1.1.2数据库设计1.1.3通信设计1.1.3.1报文协议格式1.1.3.2报文交互场景1.2Netty简单示例1.2.1pom.xml1.2.2发送和接收1.2.3示例说明1.2.3.1线程阻塞问题1.2.3.2服务端和接收端EventLoopGroup1.3Netty中handler概述1.4聊天服务......