Запросы Python: как получить и отправить изображение без сохранения на диск?
API, над которым я работаю, имеет метод отправки изображений POSTING в /api/pictures/
с файлом изображения в запросе.
Я хочу автоматизировать некоторые образцы изображений с помощью библиотеки запросов Python, но я не совсем уверен, как это сделать. У меня есть список URL-адресов, указывающих на изображения.
rv = requests.get('http://api.randomuser.me') resp = rv.json() picture_href = resp['results'][0]['user']['picture']['thumbnail'] rv = requests.get(picture_href) resp = rv.content rv = requests.post(prefix + '/api/pictures/', data = resp)
rv.content
возвращает байт-код. Я получаю 400 Bad Request с сервера, но не появляется сообщение об ошибке. Я полагаю, что я либо неправильно rv.content
картину, когда делаю rv.content
либо неправильно ее rv.content
с data = resp
. Я на правильном пути? Как отправить файлы?
–Редактировать–
Я изменил последнюю строку на
rv = requests.post('myapp.com' + '/api/pictures/', files = {'file': resp})
Код на стороне сервера (флажок):
file = request.files['file'] if file and allowed_file(file.filename): ... else: abort(400, message = 'Picture must exist and be either png, jpg, or jpeg')
Сервер прерывается с кодом состояния 400 и выше. Я также пробовал читать с BytesIO, не помог.
Проблема заключается в том, что ваши данные не являются файлом, а потоком байтов. Поэтому у него нет «имени файла», и я подозреваю, что поэтому ваш код сервера не работает.
Попробуйте отправить правильное имя файла вместе с правильным типом mime с вашим запросом:
files = {'file': ('user.gif', resp, 'image/gif', {'Expires': '0'})} rv = requests.post('myapp.com' + '/api/pictures/', files = files)
Вы можете использовать imghdr
для определения того, с каким изображением вы сталкиваетесь (чтобы получить правильный тип mime):
import imghdr image_type = imghdr.what(None, resp) # You should improve this logic, by possibly creating a # dictionary lookup mime_type = 'image/{}'.format(image_type)
- Сбой компиляции, только когда я запускаю его как удаленную службу с помощью PsExec
- Python pickle: ImportError: нет модуля с именем __main__