Отправьте файл InMemoryUploadedFile из поля ввода файла на другой внешний сервер
У меня есть файл изображения, который выбирается из поля ввода и публикуется через форму в Django.
Данные формы и изображение я хочу опубликовать на другом сервере.
Кажется, проблема в том, что данные файла в запросе имеют тип InMemoryUploadedFile, который необходимо преобразовать вместе с другими опубликованными данными (формат json).
в основном мой код:
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
def some_view(request):
files=None
if request.FILES:
key = 'expected_image_name' #something else here, but not relevant
if key in request.FILES:
memfile = request.FILES.get(key, None)
if memfile:
files={}
# note this works: but does not upload the file:
# files["image"]= memfile.read()
# So trying a lot of other things, like:
files["image"]= ContentFile(memfile.read(), name=memfile.name).read()
# I also retrieve some data from request.Post... but for simplycity lets say it is:
post_values = {"some_other_field": "whatever"}
register_openers()
url="My post url"
# for simplycity I leave out the authentication, the problem is not in there
if files:
multi_data=post_values
multi_data.update(files)
datagen, headers = multipart_encode(multi_data)
request = urllib2.Request(url, datagen, headers)
response = urllib2.urlopen(request)
else:
request = urllib2.Request(url)
response = urllib2.urlopen(request,data)
Что бы я ни пытался... файл не загружается на сервер.
ведение журнала респонсе... элемент создан... но изображение = null
кто-нибудь предложение о том, что я пропускаю здесь....
РЕДАКТИРОВАТЬ вторник 2013 - 6 - 4
Я поместил эту запись в последний: 'if files' часть logger.debug('DEBUG: datagen: %s' % datagen) logger.debug('DEBUG: headers: %s' % headers)
Я получил это там:
DEBUG get_response: datagen: <poster.encode.multipart_yielder instance at 0x7fdb7cca4200>
DEBUG get_response: headers: {'Content-Length': '30349', 'Content-Type': 'multipart/form-data; boundary=baa9e321554a49c6b626c68860a90aaf'}
И больше информации: я отправляю это из формы ввода jquery
форма в HTML выглядит так:
<form data-ajax="false" id="form_5" method="post" enctype="multipart/form-data" action="My url to the view above">
<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='z47GsVwsBOzu3HrUMIZaI4hoyV2ljLVa' /></div>
<!-- and some other fields in input fields -->
<input type="file" name="expected_image_name" data-role="button" id="expected_iamge_name" value="Select photo"/>
<input type="submit" value="Submit">
</form>
1 ответ
Это было полезно: опубликовать запрос с multipart/form-data в appengine python не работает
Кажется, multipart_encode не может взять файл памяти напрямую...
поэтому я изменил свой код на:
добавил импорт:
from poster.encode import MultipartParam
files["image"]= MultipartParam("image", filename=memfile.name, filetype=memfile.content_type, fileobj=memfile.file)
И это работает!!!