Python Requests PUT请求无法更新文件字段问题求助
问题解决:PUT请求上传文件字段失败的修复
问题背景
- 初始使用JSON格式发送PUT请求,成功上传文本字段
- 当在
file.yaml中为svg、screenshot1-3字段添加本地文件路径后,请求返回400错误,提示「提交的数据不是文件」 - 尝试使用
requests_toolbelt.MultipartEncoder但仍传JSON数据,请求返回202但文件字段未更新
错误原因
你创建了MultipartEncoder实例,但请求时仍传递json.dumps(file_infos)作为数据,本质还是把文件路径当普通字符串发送,没有实际读取本地文件并以文件字段形式上传。
解决方案
修改代码,将yaml中的文件路径转换为二进制文件对象,用MultipartEncoder正确构建多表单数据,并发送该实例作为请求数据。
修改后的完整代码
import base64 from pathlib import Path import requests import yaml from requests_toolbelt.multipart.encoder import MultipartEncoder BASE_URL = "https://url.com" # API Host FILE_FOLDER = Path.cwd() # Current working directory if __name__ == "__main__": public_key = <public_key> private_key = <private_key> auth_key = f"{public_key}:{private_key}".encode("utf-8") encodedKey = base64.b64encode(auth_key).decode("utf-8") def update_app_info(): infos_file = FILE_FOLDER / "file.yaml" with open(infos_file) as infos_file_data: yamlcontent = yaml.safe_load(infos_file_data) file_infos = yamlcontent["index"][0] # 处理文件字段:将路径转换为二进制文件对象 file_fields = ["svg", "screenshot1", "screenshot2", "screenshot3"] multipart_fields = {} for key, value in file_infos.items(): if key in file_fields and value: # 拼接完整文件路径,以二进制模式打开 file_path = FILE_FOLDER / value multipart_fields[key] = (file_path.name, open(file_path, "rb")) else: # 普通文本字段直接保留原值 multipart_fields[key] = value # 构建多表单编码器 m = MultipartEncoder(fields=multipart_fields) headers = { "Authorization": f"Basic {encodedKey}", "Content-Type": m.content_type, } # 发送PUT请求,传递MultipartEncoder实例作为数据 response = requests.put( f"{BASE_URL}/path/to/api_endpoint/{public_key}", data=m, headers=headers ) print(response) print(response.json()) # 关闭打开的文件,释放资源 for key in file_fields: if key in multipart_fields and isinstance(multipart_fields[key], tuple): multipart_fields[key][1].close() update_app_info()
关键修改点
- 文件字段转换:识别
svg、screenshot1-3字段,将yaml中的相对路径转换为本地文件的二进制对象,以(文件名, 文件对象)格式传入多表单字段 - 请求数据替换:将
data=json.dumps(file_infos)改为data=m,实际发送多表单格式数据 - 资源释放:添加文件关闭逻辑,避免文件句柄泄漏
内容的提问来源于stack exchange,提问作者aaronted
相关产品推荐
相关产品推荐

