Seatunnel2.3.5的FTP无法读取中文路径的问题

问题原因

Seatunnel的connector-file下的ftp包中关于读取文件的路径没有对路径进行编码导致当有中文的时候会出现乱码

修改源码

我们需要修改两处位置 一处是判断路径是否存在的方法
一处是读取文件的流的地方

修改判断文件是否存在的地方

这个文件的路径是org/apache/seatunnel/connectors/seatunnel/file/ftp/system/SeaTunnelFTPFileSystem.java
在这里插入图片描述

    private FileStatus getFileStatus(FTPClient client, Path file) throws IOException {FileStatus fileStat = null;Path workDir = new Path(client.printWorkingDirectory());Path absolute = makeAbsolute(workDir, file);Path parentPath = absolute.getParent();if (parentPath == null) { // root dirlong length = -1; // Length of root dir on server not knownboolean isDir = true;int blockReplication = 1;long blockSize = DEFAULT_BLOCK_SIZE; // Block Size not known.long modTime = -1; // Modification time of root dir not known.Path root = new Path("/");return new FileStatus(length, isDir, blockReplication, blockSize, modTime, root.makeQualified(this));}String pathName = parentPath.toUri().getPath();FTPFile[] ftpFiles = client.listFiles(pathName);//TODO 修改的地方//regionif (ftpFiles == null) {client.setControlEncoding("UTF-8");client.sendCommand("OPTS UTF8", "ON");client.enterLocalActiveMode();//进行编码ftpFiles = client.listFiles(new String(pathName.getBytes("UTF-8"),"ISO-8859-1"));}//endregionif (ftpFiles != null) {for (FTPFile ftpFile : ftpFiles) {if (ftpFile.getName().equals(file.getName())) { // file found in dirfileStat = getFileStatus(ftpFile, parentPath);break;}}if (fileStat == null) {throw new FileNotFoundException("File " + file + " does not exist.");}} else {throw new FileNotFoundException("File " + file + " does not exist.");}return fileStat;}

修改获取文件流的地方

这个open方法也存在同样的问题需要修改
在这里插入图片描述
修改后:
在这里插入图片描述

@Overridepublic FSDataInputStream open(Path file, int bufferSize) throws IOException {FTPClient client = connect();Path workDir = new Path(client.printWorkingDirectory());Path absolute = makeAbsolute(workDir, file);FileStatus fileStat = getFileStatus(client, absolute);if (fileStat.isDirectory()) {disconnect(client);throw new FileNotFoundException("Path " + file + " is a directory.");}client.allocate(bufferSize);Path parent = absolute.getParent();// Change to parent directory on the// server. Only then can we read the// file// on the server by opening up an InputStream. As a side effect the working// directory on the server is changed to the parent directory of the file.// The FTP client connection is closed when close() is called on the// FSDataInputStream.boolean haschangeDirecory = client.changeWorkingDirectory(parent.toUri().getPath());//region//TODO 修改的地方//判断是否成功切换到工作路径下 如果没有切换成功可能是因为存在中文路径导致的if (!haschangeDirecory) {String newpath = new String(parent.toUri().getPath().getBytes("UTF-8"), "ISO-8859-1");client.changeWorkingDirectory(newpath);}InputStream is = client.retrieveFileStream(file.getName());if (null==is){String newfilename = new String(file.getName().getBytes("UTF-8"), "ISO-8859-1");is = client.retrieveFileStream(newfilename);}//endregionFSDataInputStream fis = new FSDataInputStream(new FTPInputStream(is, client, statistics));if (!FTPReply.isPositivePreliminary(client.getReplyCode())) {// The ftpClient is an inconsistent state. Must close the stream// which in turn will logout and disconnect from FTP serverfis.close();throw new IOException("Unable to open file: " + file + ", Aborting");}return fis;}

建议config里面也修改一下
在这里插入图片描述

修改完成之后打个包放到Linux下connector的那个文件夹的位置下就可以了

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

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

相关文章

基于java的果蔬种植销售一体化服务平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

【云岚到家】-day10-1-状态机增删查

【云岚到家】-day10-1-状态机增删查 1 订单管理1)订单管理管什么? 2 基础设计2.1 订单状态流转1)订单状态流转图2)订单状态3)服务单状态 2.2 数据库设计1)表设计2)分库分表 2.3 状态机设计1&…

ICML24|通用时间序列预测大模型思路

论文标题:Unified Training of Universal Time Series Forecasting Transformers GitHub链接:https://github. com/SalesforceAIResearch/uni2ts 论文链接:https://arxiv.org/pdf/2402.02592 前言 普适预测器是一个能够处理任何时间序列预…

LRU(Least Recently Used,最近未使用)

一、LRU的由来 lru的引入主要是和内存回收有关。 属于内核的大部分page是不能够进行回收的,比如内核栈、内核代码段、内核数据段以及大部分内核使用的page,它们都是不能够进行回收的; 相反,进程使用的page,比如进程…

网盘聚合搜索项目Aipan(爱盼)

本文软件由网友 刘源 推荐; 简介 什么是 Aipan(爱盼) ? Aipan(爱盼)是一个基于 Vue 和 Nuxt.js 技术构建的开源网盘搜索项目。其主要目标是为用户提供一个能够自主拥有和管理的网盘搜索网站。该项目持续维护和更新&a…

i春秋-Hash(__wakeup沉默、序列化)

练习平台地址 竞赛中心 题目描述 题目内容 啥也没有就一个标签跳转 点击后的确发生了跳转 观察到url中有key和hash两个值,猜测hash是key的hash 查看源代码发现确实是 $hashmd5($sign.$key);the length of $sign is 8 解密得到$sign应该为kkkkkk01 构造122的hash i…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的智能蒙绮英语学习系统设计与实现

开题报告 随着全球化的不断深入,英语作为国际通用语言,其重要性日益凸显。掌握英语不仅可以拓宽个人的视野和知识面,还可以增强个人竞争力,为个人职业发展带来更多机会。因此,开发一款能够帮助用户更高效地学习英文单…

Blender vs 3dMax谁才是3D软件的未来?

在探讨Blender与3ds Max谁才是3D软件的未来时,我们需要从多个维度对这两款软件进行详细分析。 Blender的优势 开源免费:Blender是一款完全免费的开源3D创作套件,这使得它成为独立艺术家、业余爱好者和小型工作室的首选。用户无需承担巨额的…

ubuntu安装cuda、cudnn和TensoRT【分步安装】

我说实话,这个环境安装真的要了老命,太tm恶心了。 因为遇到了很多问题,非常之恶心 问题一:版本对应 问题二:下载具慢 问题三:上NVIDIA有时候上不去 问题四:找到对应版本点不了 问题五&…

基于树莓派的边缘端 AI 目标检测、目标跟踪、姿态估计 视频分析推理 加速方案:Hailo with ultralytics YOLOv8 YOLOv11

文件大纲 加速原理硬件安装软件安装基本设置系统升级docker 方案Demo 测试目标检测姿态估计视频分析参考文献前序树莓派文章hailo加速原理 Hailo 发布的 Raspberry Pi AI kit 加速原理,有几篇文章介绍的不错 https://ubuntu.com/blog/hackers-guide-to-the-raspberry-pi-ai-ki…

网络工程实验一:静态路由的配置

#实验仅供参考,勿直接粘贴复制,用以学习交流# 1、实验目的: 熟悉eNSP网络仿真工具平台。 掌握静态路由配置方法。 能够配置路由器接口地址。 2、实验内容: 2.1、安装对应的软件: (1)Virtual …

基于java的宠物用品交易平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

华为VPN技术

1.启动设备 2.配置IP地址 [FW1]int g1/0/0 [FW1-GigabitEthernet1/0/0]ip add 192.168.1.254 24 [FW1-GigabitEthernet1/0/0]int g1/0/1 [FW1-GigabitEthernet1/0/1]ip add 100.1.1.1 24 [FW1-GigabitEthernet1/0/1]service-manage ping permit [FW2]int g1/0/0 [FW2-Gi…

鸿蒙进阶篇-数组常用方法(一)

大家好,这里是鸿蒙开天组,今天咱们来学习一下数组的常用方法。 数组在编程中是非常常见的数据类型,毕竟需要用到的场合太多了,所以我们今天来使劲学习一下常用方法,在这里也没法一一列全,但是大家也可以根…

整数唯一分解定理

整数唯一分解定理,也称为算术基本定理,是由德国数学家高斯在其著作《算术研究》中首次提出的。本文回顾整数唯一分解定理以及对应的几个重要结论。 一、整数唯一分解定理 整数唯一分解定理,也称为算术基本定理,是数论中的一个重…

对Pod做一个详细了解

文章目录 01创建一个pod02删除pod03镜像拉取策略04pod的标签05pod资源限制方法06pod的重启策略 07pod中运行多个容器08对pod内的容器执行命令09 验证多个pod中多个容器网络共享10 pod的创建流程和调度的约束方式pod的声明周期介绍pod 的健康检查健康检查的方式probe的探测方式案…

LinkedHashMap实现LRU

LRU 环境:JDK11 最近接触LRU(Least Recently Used),即最近最少使用,也称淘汰算法,在JDK中LinkedHashMap有相关实现 LRU的LinkedHashMap实现 LinkedHashMap继承HashMap。所以内存的存储结构和HashMap一样,但是LinkedH…

基于rk356x u-boot版本功能分析及编译相关(三)Makefile分析

🎏技术驱动源于热爱,祝各位学有所成。 文章目录 一、Makefile简要概述二、简要流程图三、Makefile文件具体分析大家好哈,这次因工作比较忙,文章更新拖的有些久了。哈哈,话不多说,咱们接着上次继续说u-boot的Makefile。 一、Makefile简要概述 一般要了解u-boot源码的编译…

shell(1)脚本创建执行与变量使用

shell(1)脚本创建执行与变量使用 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流&…