【问题标题】:file upload works with curl and postman but not python requests文件上传适用于 curl 和 postman,但不适用于 python 请求
【发布时间】:2018-04-27 22:24:14
【问题描述】:

我正在尝试使用 python 请求库将 CSV 文件上传到 API(这给了我很少的错误信息)。

(我正在运行 Python 3.5 并在 OS X 10.11.6 上使用请求版本 2.18.4)

终端中的这个 curl 命令可以正常工作:curl -F 'file=@/path/to/file.csv' myurl.com/upload -H "Authorization: TOKEN sometoken"

来自 Postman 的 multipart/form-data POST 请求也有效,但我似乎无法使其与 python 请求库一起工作。

我已经尝试了这个请求的许多变体:

import requests
headers = {'Authorization': 'TOKEN sometoken', 'Content-Type': 'multipart/form-data'}

with open(file_path, 'rb') as f:
    r = requests.post(myurl, headers=headers, data=f)

## I've also tried data={"file": f}

我得到一个状态码 200,但响应是 {"success": "false"}(令人沮丧地没有帮助)。

与 curl 请求相比,python 请求中缺少什么?

编辑:看来-F-F 标志curl 命令模拟已提交的HTML 表单...有没有办法用请求做到这一点?

【问题讨论】:

    标签: python python-3.x curl file-upload python-requests


    【解决方案1】:

    在您的 curl 代码中,您使用的是 -F 参数,该参数将数据作为多部分消息提交 - 换句话说,您正在上传文件。
    使用requests,您可以使用files 参数发布文件。一个例子:

    import requests
    
    headers = {'Authorization': 'TOKEN sometoken'}
    data = {'file': open(file_path, 'rb')}
    r = requests.post(myurl, headers=headers, files=data)
    

    请注意,requests 根据提交的数据自动创建 Content-Type 标头。

    【讨论】:

    【解决方案2】:

    python open() function 返回一个文件对象。这不是您要发送到 API 的内容。
    相反,您可以使用:

    with open(file_path, 'rb') as f:
        r = requests.post(myurl, headers=headers, data=f.read())
    

    语法取自here

    【讨论】:

    • 不幸的是,这并没有成功。我希望我能提供更多信息,但我绝对没有错误信息可以继续。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2015-09-19
    • 2022-01-21
    • 2017-08-06
    • 1970-01-01
    相关资源
    最近更新 更多