Python POST StringIO с использованием плаката

Вот ситуация:

Я использую PIL для обработки изображения, затем сохраняю его в объект StringIO. Теперь я хочу разместить объект StringIO через плакат. Но я не могу получить изображение в запросе. ФАЙЛЫ продиктованы. Я несколько часов гуглил, нашел такой вопрос, python: отправлять данные в stringIO через постер? Я пытался, но не работает.

Итак, я прочитал исходный код автора и обнаружил, что он пытается получить атрибут name для файла-подобного объекта param, но кажется, что объект StringIO не имеет атрибута name, поэтому имя файла и тип файла Никто

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

Я правильно сделал? Как правильно размещать объект StringIO через плакат?

1 ответ

Решение

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

Тогда ваш подход совершенно верен. Просто установите .name приписывать побуждение poster в обнаружении типа пантомимы.

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

Другие вопросы по тегам