2013-07-15 3 views
0

Вот ситуация:питон опубликовать StringIO используя плакат

Я использую PIL для обработки изображения, то я сохраняю его в объект StringIO. Теперь, я хочу, чтобы POST объект StringIO через плакат. Но, я не могу получить изображение в request.FILES dict. У меня есть несколько часов в Интернете, я нашел этот вопрос, python : post data within stringIO through poster? Я пробовал, но не работал.

Итак, я прочитал исходный код плаката и попытался получить атрибут «имя» параметра файла, подобного объекту, но похоже, что объект StringIO не имеет атрибута «name». Таким образом, имя файла и тип файла являются None

if hasattr(value, 'read'): 
    # Looks like a file object 
    filename = getattr(value, 'name', None) 
    if filename is not None: 
     filetype = mimetypes.guess_type(filename)[0] 
    else: 
     filetype = None 

    retval.append(cls(name=name, filename=filename, 
     filetype=filetype, fileobj=value)) 
else: 
    retval.append(cls(name, value)) 

Итак, я указать имя отнесение объекта StringIO и, кажется, отлично работает.

im_tmp = Image.open(StringIO(bits)) 
//bits: the binary chars of a image 
im_res = ImageAPI.process(im_tmp, mode, width, height) 
//ImageAPI: a class that use PIL methods to process image 
output = StringIO() 
im_res.save(output, format='PNG') 
output.name = 'tmp.png' 
//I add above code and it works 
call(url_str=url, file_dict={'file':output}) 
//call: package of poster 

Правильно ли я сделал? Каков правильный способ POST объекта StringIO через плакат?

ответ

0

Согласно this commit, что делает имя необязательно было сделано явно для поддержки проходящей в StringIO объекта, но, как вы обнаружили, что затем пропускает определения типа пантомимы и по умолчанию text/plain вместо этого.

Ваш подход тогда совершенно правильный. Просто установите атрибут .name, чтобы включить poster в определение типа мим.

Альтернативой является использование лучшей библиотеки для POST в Интернете. Я рекомендую вам взглянуть на requests, который из supports multipart POSTing of files из коробки, включая способ установить имя файла. Тип mimetype будет основан на этом явном имени файла, если он передан.

+0

спасибо, но в проекте используется плакат, и я не могу изменить структуру. – Jinvan

Смежные вопросы