0

0

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

星降

星降

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

|

410人浏览过

|

来源于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();

// 正确:用 InputStream 显式控制内容 sftp.put(new FileInputStream("/tmp/data.xml"), "/remote/data.xml");

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

client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect("host", username="user", password="pass") sftp = client.open_sftp()

with open("/tmp/data.xml", "rb") as f: content = f.read() # 保持原始字节流,不 decode sftp.putfo(BytesIO(content), "/remote/data.xml")

sftp.close() client.close()

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

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

  • 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 字节)。先确认文件能本地解析成功,再上传,别跳步。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

758

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

636

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

761

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1264

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

548

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

708

2023.08.11

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

26

2026.01.16

热门下载

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

精品课程

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

共48课时 | 7.3万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

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

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