You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:40:32