能否通过URL直接向FTP服务器上传文件?求适用Python库
如何直接将URL指向的文件上传至FTP服务器(无需本地存储)?
没问题!你提到的需求完全可以实现——虽然ftplib默认是处理本地文件,但我们可以结合HTTP请求库实现流式上传,全程不用把文件存到本地,非常适合你用手机操作的场景。
实现思路
核心逻辑是:用requests库以流的方式获取远程URL的文件数据,然后直接把这个数据流传给ftplib的上传方法,跳过本地存储的步骤。
步骤1:准备依赖
首先确保你安装了requests库(如果没装的话):
pip install requests
步骤2:完整代码示例
import ftplib import requests def upload_url_to_ftp(file_url, ftp_host, ftp_user, ftp_pass, remote_filename): # 初始化FTP连接并登录 try: ftp = ftplib.FTP(ftp_host) ftp.login(ftp_user, ftp_pass) # 开启被动模式(绝大多数公共FTP服务器都需要这个) ftp.set_pasv(True) # 流式获取目标URL的文件,不加载到本地内存/存储 with requests.get(file_url, stream=True) as response: response.raise_for_status() # 检查HTTP请求是否成功(比如404、500) # 直接将数据流上传到FTP服务器 ftp.storbinary(f"STOR {remote_filename}", response.raw) print(f"✅ 文件 {remote_filename} 上传成功!") ftp.quit() except ftplib.all_errors as e: print(f"❌ FTP操作出错: {e}") except requests.exceptions.RequestException as e: print(f"❌ HTTP请求出错: {e}") # 调用示例,替换成你的实际参数 if __name__ == "__main__": TARGET_FILE_URL = "https://vignette.wikia.nocookie.net/disney/images/d/db/Donald_Duck_Iconic.png" YOUR_FTP_HOST = "你的FTP服务器地址" YOUR_FTP_USER = "你的FTP用户名" YOUR_FTP_PASS = "你的FTP密码" REMOTE_SAVE_NAME = "donald_duck_icon.png" # 上传到FTP后的文件名 upload_url_to_ftp(TARGET_FILE_URL, YOUR_FTP_HOST, YOUR_FTP_USER, YOUR_FTP_PASS, REMOTE_SAVE_NAME)
关键细节说明
stream=True:让requests不会一次性把整个文件下载到内存,而是分块读取,既节省内存,也避免占用本地存储。response.raw:这是一个类文件对象,刚好符合ftp.storbinary()的参数要求,实现了“边获取边上传”的流式传输。ftp.set_pasv(True):被动模式是多数FTP服务器的要求,能避免防火墙主动连接被阻塞,一定要加上。
注意事项
- 确保你的FTP账号有目标目录的写入权限。
- 如果遇到HTTPS证书验证失败的问题,可以在
requests.get里临时添加verify=False,但仅限测试环境使用,生产环境建议配置正确的证书。 - 对于超大文件,这种流式处理比先下载再上传的效率高很多,尤其适合手机这类存储有限的设备。
内容的提问来源于stack exchange,提问作者equallyhero
相关产品推荐
相关产品推荐

