Python开发的FTP客户端如何修改以上传非当前目录文件?
解决FTP客户端上传任意目录文件的问题
嘿,我来帮你搞定这个问题!你的FTP客户端现在只能上传当前目录的文件,核心原因是你在代码里只指定了文件名,而没有提供文件的完整路径(不管是绝对路径还是相对路径)。下面我给你一步步说明怎么修改:
核心问题分析
原来的代码里filename = "f.txt"只是当前脚本运行目录下的文件名,当你要传其他目录的文件时,必须告诉Python文件的具体位置——要么是从根目录开始的绝对路径,要么是相对于当前脚本的相对路径。
另外还有个容易踩的坑:FTP的STOR命令后面的参数是服务器上要保存的文件名,如果直接把本地的完整路径丢进去,服务器会试图创建对应的目录结构(比如你传C:/Users/Me/File.txt,服务器会想创建C:/Users/Me/这个目录,几乎肯定会失败),所以最好把本地路径和服务器保存的文件名分开处理。
修改后的完整代码
我给你调整了代码,加上了跨平台的路径处理和基本的错误提示,这样更健壮:
from ftplib import FTP import os # 初始化FTP连接 ftp = FTP() ftp.connect("127.0.0.1", 1026) ftp.login() ftp.retrlines('LIST') # 打印服务器当前目录内容,方便确认 def uploadFile(): # 替换成你要上传的文件路径:可以是绝对路径、相对路径 # Windows示例:local_file_path = "D:/Downloads/my_photo.png" # Linux/macOS示例:local_file_path = "/home/yourname/Documents/work_note.txt" # 相对路径示例(当前脚本的上一级目录里的文件):local_file_path = "../test_files/data.csv" local_file_path = "D:/Documents/report.pdf" # 提取本地文件的文件名,作为服务器上的保存名称 server_save_name = os.path.basename(local_file_path) try: # 用with语句打开文件,自动处理关闭,更安全 with open(local_file_path, 'rb') as file_obj: ftp.storbinary(f'STOR {server_save_name}', file_obj) print(f"✅ 文件 {server_save_name} 上传成功!") except FileNotFoundError: print(f"❌ 错误:找不到文件 {local_file_path},请检查路径是否正确") except PermissionError: print(f"❌ 错误:没有读取文件 {local_file_path} 的权限") except Exception as e: print(f"❌ 上传失败:{str(e)}") # 调用上传函数 uploadFile() # 关闭FTP连接 ftp.quit() print("🔌 FTP连接已关闭")
关键修改点说明
- 指定完整文件路径:把
local_file_path改成你要上传的文件的实际路径,不管文件在哪个目录都能找到 - 分离本地路径与服务器文件名:用
os.path.basename()提取文件名,避免把本地的目录结构带到服务器上(如果你确实想在服务器上创建相同的目录结构,那可以保留完整路径,但需要先在服务器上创建对应的目录) - 安全的文件打开方式:用
with open()代替直接open(),确保文件会被正确关闭,避免资源泄漏 - 异常处理:添加了常见错误的捕获,比如文件找不到、权限不足,方便你快速排查问题
内容的提问来源于stack exchange,提问作者Ricky Martinz
相关产品推荐
相关产品推荐

