Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

unable to post file+data using python-requests

I'm able to post file using 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'

Which I can get (file) as

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

But when I tried same thing using requests.post, I got error. Does anybody know why this happen. (Post Error encounter when file pointer is not at last, but when file pointer is at last, I got response 200 but file is not posted)

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)

Error: (from usergrid) with response code: 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

like image 334
Lionel Avatar asked Dec 24 '22 12:12

Lionel


2 Answers

I believe the problem is that Python is not sending a content-type field for the image that you are sending. I traced through the Usergrid code using a debugger and saw that curl is sending the the content-type for the image and Python is not.

I was able to get this exact code to work on my local 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)

It is possible that Waken Meng's answer did not work because of the syntax of the files variable, but I'm no Python expert.

like image 66
snoopdave Avatar answered Dec 28 '22 06:12

snoopdave


I met a problem before when i try to upload image files. Then I read the doc and do this part:

You can set the filename, content_type and headers explicitly:

Here is how I define the file_data:

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

file_data should be a a list: [(param_name, (file_name, file, content_type))]

This works for me, hope can help you.

like image 32
waken meng Avatar answered Dec 28 '22 05:12

waken meng