文件上传适用于curl和postman但不适用于python请求

时间:2018-04-27 22:24:15

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

我正在尝试使用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命令的curl标志模拟已提交的HTML表单...有没有办法对请求执行此操作?

2 个答案:

答案 0 :(得分:2)

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标头。

答案 1 :(得分:1)

python #include <stdio.h> void countdown (int n) { printf("n = %d\t", n); n--; if (n >= 0) { countdown(n); } printf("n = %d\t", n); } int main() { countdown(2); return 0; } function返回一个文件对象。这不是您要发送给API的内容 相反,您可以使用:

open()

here获取的语法。