4

我可以使用 curl 发布文件

curl -X POST -i -F name='barca' -F country='spain' -F 
file=@/home/messi/Desktop/barca.png 'http://localhost:8080/new_org/hel/concerts'

我可以得到(文件)作为

 curl -X GET -H 'Accept: image/png' 'http://localhost:8080/new_org/hel/concerts/<id or name of entity>'

但是当我尝试使用相同的东西时requests.post,我得到了错误。有谁知道为什么会这样。(当文件指针最后不是时遇到发布错误,但是当文件指针最后时,我得到响应 200 但文件没有发布)

import requests
url = 'http://localhost:8080/new_org/hel/concerts'
file = dict(file=open('/home/messi/Desktop/barca.png', 'rb'))
data = dict(name='barca', country='spain')
response = requests.post(url, files=file, data=data)

错误:(来自usergrid)响应代码:400

{u'duration': 0,
 u'error': u'illegal_argument',
 u'error_description': u'value is null',
 u'exception': u'java.lang.IllegalArgumentException',
 u'timestamp': 1448330119021}

https://github.com/apache/usergrid

4

2 回答 2

9

我认为问题在于 Python 没有为您发送的图像发送内容类型字段。我使用调试器跟踪了 Usergrid 代码,发现 curl正在发送图像的内容类型,而 Python 没有。

我能够让这个确切的代码在我的本地 Usergrid 上工作:

import requests
url = 'http://10.1.1.161:8080/test-organization/test-app/photos/'
files = { 'file': ('13.jpg', open('/Users/dave/Downloads/13.jpg', 'rb'), 'image/jpeg')}
data = dict(name='barca', country='spain')
response = requests.post(url, files=files, data=data)

由于 files 变量的语法,Waken Meng 的答案可能不起作用,但我不是 Python 专家。

于 2015-11-29T19:49:24.797 回答
1

我在尝试上传图像文件之前遇到了一个问题。然后我阅读了文档并做这部分:

您可以显式设置文件名、内容类型和标题:

这是我定义file_data的方式:

file_data = [('pic', ('test.png', open('test.png'), 'image/png'))]
r = requests.post(url, files=file_data)

file_data 应该是一个列表:[(param_name, (file_name, file, content_type))]

这对我有用,希望可以帮助你。

于 2015-11-27T06:42:57.103 回答