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

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()

关键修改点

  1. 文件字段转换:识别svg、screenshot1-3字段,将yaml中的相对路径转换为本地文件的二进制对象,以(文件名, 文件对象)格式传入多表单字段
  2. 请求数据替换:将data=json.dumps(file_infos)改为data=m,实际发送多表单格式数据
  3. 资源释放:添加文件关闭逻辑,避免文件句柄泄漏

内容的提问来源于stack exchange,提问作者aaronted

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:30:46