如何通过POST请求以bytes对象提交文件(无需写入本地磁盘)
直接用Bytes对象提交POST文件上传请求
当然可以!完全没必要把从响应中获取的response.content先写入本地磁盘再重新上传——requests库原生支持直接使用字节对象来构造文件上传请求,这样能省掉磁盘IO的步骤,效率更高。
具体做法说明
原来你用open('local.pdf', 'rb')得到的是一个类文件对象,而requests的files参数接受的每个值可以是一个元组,格式为:(文件名, 字节对象, [可选的Content-Type])。这样就能直接把内存里的字节内容当作文件提交。
完整代码示例
import requests # 先从目标接口下载文件到内存(得到bytes对象) download_response = requests.get("https://example.com/target-file.pdf") file_content = download_response.content # 构造上传用的files参数,直接用内存中的bytes upload_files = { "file": ("my-uploaded-file.pdf", file_content, "application/pdf") } # 发送POST上传请求 upload_response = requests.post("https://your-upload-endpoint.com", files=upload_files) # 可以检查上传结果 if upload_response.status_code == 200: print("文件上传成功!") else: print(f"上传失败,状态码: {upload_response.status_code}")
细节补充
- 元组里的第一个元素是服务器端会接收到的文件名,你可以根据需要自定义,不一定和原文件名一致。
- 第三个元素的
Content-Type是可选的,但建议指定(比如PDF用application/pdf,图片用image/jpeg),这样服务器能更准确地识别文件类型;如果不填,requests会尝试自动推断,但可能出现偏差。 - 这种方式完全在内存中处理文件,避免了本地磁盘的读写操作,特别适合临时处理文件的场景。
内容的提问来源于stack exchange,提问作者Paul Blackburn
相关产品推荐
相关产品推荐

