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 будет основан на этом явном имени файла, если оно будет передано.