在业务系统中,经常需要把生成的XML格式数据文件传输到远程服务器,使用FTP协议是较为常见的实现方式,Java和Python都有成熟的库支持这类操作,下面分别介绍两种语言的实现方法。

Java实现FTP上传XML文件
Java中可以使用Apache Commons Net库提供的FTP客户端功能完成上传操作,首先需要引入对应的依赖。
依赖引入
如果是Maven项目,在pom.xml中添加以下依赖:
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.9.0</version>
</dependency>
核心实现代码
以下是完整的上传示例代码,包含连接、上传、断开连接的完整流程:
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FtpXmlUploader {
public static void uploadXmlFile(String ftpHost, int ftpPort, String ftpUser, String ftpPassword,
String remoteDir, String localFilePath) {
FTPClient ftpClient = new FTPClient();
FileInputStream inputStream = null;
try {
// 连接FTP服务器
ftpClient.connect(ftpHost, ftpPort);
// 登录
boolean loginSuccess = ftpClient.login(ftpUser, ftpPassword);
if (!loginSuccess) {
throw new RuntimeException("FTP登录失败,请检查用户名和密码");
}
// 设置文件类型为二进制,避免XML文件内容损坏
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
// 开启被动模式,适配多数服务器配置
ftpClient.enterLocalPassiveMode();
// 切换到目标远程目录,不存在则创建
boolean dirExist = ftpClient.changeWorkingDirectory(remoteDir);
if (!dirExist) {
ftpClient.makeDirectory(remoteDir);
ftpClient.changeWorkingDirectory(remoteDir);
}
// 读取本地XML文件
File localFile = new File(localFilePath);
inputStream = new FileInputStream(localFile);
// 上传文件,使用本地文件名作为远程文件名
boolean uploadSuccess = ftpClient.storeFile(localFile.getName(), inputStream);
if (uploadSuccess) {
System.out.println("XML文件上传成功");
} else {
System.out.println("XML文件上传失败");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
if (ftpClient.isConnected()) {
ftpClient.logout();
ftpClient.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// 调用示例,替换为实际的FTP信息和文件路径
uploadXmlFile("192.168.0.1", 21, "ftp_user", "ftp_pwd", "/xml_data", "D:/test.xml");
}
}
Python实现FTP上传XML文件
Python标准库自带ftplib模块,不需要额外安装第三方库就可以实现FTP上传功能,使用起来更加轻量。
核心实现代码
以下是Python的FTP上传XML文件示例代码:
from ftplib import FTP
def upload_xml_file(ftp_host, ftp_port, ftp_user, ftp_password, remote_dir, local_file_path):
ftp = FTP()
try:
# 连接FTP服务器
ftp.connect(ftp_host, ftp_port)
# 登录
ftp.login(ftp_user, ftp_password)
# 切换到二进制传输模式
ftp.set_pasv(True)
# 切换到远程目录,不存在则创建
try:
ftp.cwd(remote_dir)
except:
ftp.mkd(remote_dir)
ftp.cwd(remote_dir)
# 读取本地XML文件并上传
with open(local_file_path, 'rb') as f:
# 使用本地文件名作为远程文件名
file_name = local_file_path.split('/')[-1]
upload_result = ftp.storbinary(f'STOR {file_name}', f)
if upload_result.startswith('226'):
print("XML文件上传成功")
else:
print("XML文件上传失败")
except Exception as e:
print(f"上传过程出现异常:{e}")
finally:
try:
ftp.quit()
except:
pass
if __name__ == '__main__':
# 调用示例,替换为实际的FTP信息和文件路径
upload_xml_file("127.0.0.1", 21, "ftp_user", "ftp_pwd", "/xml_data", "D:/test.xml")
两种实现的注意事项
- 上传XML文件时务必设置二进制传输模式,否则可能导致文件内容编码错误,出现乱码问题。
- 如果FTP服务器配置了被动模式,需要在代码中显式开启对应配置,否则可能出现连接超时问题。
- 上传前可以先校验本地XML文件是否存在,避免运行时出现文件找不到的异常。
- 生产环境中建议把FTP连接信息放到配置文件里,不要硬编码在代码中,提升安全性。
如果上传的XML文件较大,还可以在代码中添加上传进度监听的逻辑,方便跟踪传输状态。另外需要注意FTP协议本身是明文传输,如果涉及敏感数据,建议优先考虑SFTP等加密传输方式。