0

0

SFTP上传XML文件 Java/Python如何通过SFTP库传输

星降

星降

发布时间:2026-01-17 10:27:10

|

430人浏览过

|

来源于php中文网

原创

jsch上传xml需三步:连接、认证(设stricthostkeychecking)、传输(用inputstream避免编码问题);paramiko需处理bom和异常;注意换行符、权限及隐藏字符。

sftp上传xml文件 java/python如何通过sftp库传输

Java用JSch上传XML文件:连接、认证、传输三步到位

JSch 是 Java 最常用的 SFTP 客户端库,轻量且稳定,但默认不校验 host key,容易忽略安全风险。

  • 必须显式调用 setConfig("StrictHostKeyChecking", "no") 或提供 KnownHosts 文件,否则首次连接会抛 JSchException: UnknownHostKey
  • XML 文件建议用 put(InputStream, String) 重载,避免本地路径编码问题(尤其含中文时)
  • 不要用 ChannelSftp.put(String) 直传路径字符串——它会尝试读取本地文件,但不报错失败时静默跳过
Session session = new JSch().getSession("user", "host", 22);
session.setPassword("pass");
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp");
sftp.connect();
<p>// 正确:用 InputStream 显式控制内容
sftp.put(new FileInputStream("/tmp/data.xml"), "/remote/data.xml");</p><p>sftp.disconnect();
session.disconnect();

Python用paramiko上传XML:注意编码与异常捕获

paramiko 的 SFTPClient.put() 表面简单,但 XML 文件若含 BOM 或非 UTF-8 编码,上传后服务端解析常报 XMLSyntaxError: not well-formed

  • 上传前用 open(... , encoding="utf-8-sig") 读取并写入临时 BytesIO,可自动剥离 BOM
  • put() 不抛网络异常(如断连),需配合 try/except (IOError, OSError) 捕获底层错误
  • 避免直接传 localpath="/tmp/data.xml"——如果该路径被其他进程锁住或权限不足,paramiko 默认静默失败,日志里只显示 SSHException: Channel closed.
import paramiko
from io import BytesIO
<p>client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("host", username="user", password="pass")
sftp = client.open_sftp()</p><p>with open("/tmp/data.xml", "rb") as f:
content = f.read()  # 保持原始字节流,不 decode
sftp.putfo(BytesIO(content), "/remote/data.xml")</p><p>sftp.close()
client.close()

XML上传后解析失败?检查换行符与服务器端编码

SFTP 本身不转换文本内容,但部分 SFTP 服务端(如某些 OpenSSH 配置)或目标应用(如 Java Web Service)对行尾符敏感。Windows 生成的 XML 带 \r\n,Linux 服务端可能因 XML 声明中的 encoding="UTF-8" 误判为非法字符。

Okaaaay
Okaaaay

适用于所有人的AI文本和内容生成器

下载
  • file -i /tmp/data.xmlsftp.get() 下载已上传文件比对,确认换行符是否被修改(正常情况不应变)
  • 如果服务端用 Java DocumentBuilder 解析失败,加一行 System.setProperty("file.encoding", "UTF-8"); 再试
  • OpenSSH 的 sftp-server 默认不处理换行,但某些定制 SFTP 服务(如 Tectia)启用了文本模式,此时应禁用:sftp.put(..., preserve_mtime=False) 并确认未启用 convert 参数

要不要用 Apache Commons VFS?谨慎评估

VFS 抽象了 SFTP/FTP/WebDAV 等协议,但对 XML 场景反而增加不确定性:它的 FileObject.getContent().getInputStream() 在 SFTP 场景下会缓存整个文件到内存,大 XML(>50MB)易触发 OOM;且其 FileSystemManager 初始化慢,连接池配置晦涩。

立即学习Java免费学习笔记(深入)”;

  • 仅当项目已重度依赖 VFS 且上传逻辑分散在多协议中,才考虑统一接入
  • 否则优先用 JSch / paramiko 原生 API,可控性高,出错时堆指向明确(比如 java.net.SocketTimeoutException 直接暴露是网络层问题)
  • VFS 的 sftp://user:pass@host/path URL 中密码明文写死,审计不通过;而 JSch/paramiko 可自然对接密钥管理器(如 HashiCorp Vault SDK)

实际上传 XML 最容易卡在“没报错但对方收不到”——八成是路径权限不对(SFTP 用户 home 目录外不可写)、SELinux 上下文限制(ls -Z 查看)、或 XML 文件本身开头有不可见控制字符(用 hexdump -C data.xml | head 检查前 16 字节)。先确认文件能本地解析成功,再上传,别跳步。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1939

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2116

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1144

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

678

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

645

2023.11.24

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

2

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10万人学习

Git 教程
Git 教程

共21课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号