这里是情况:
我使用PIL处理图像,然后将其保存到StringIO对象。现在,我想通过海报发布StringIO对象。但是,我无法在request.FILES字典中获取图像。我用谷歌搜索了几个小时,发现了这个问题,python : post data within stringIO through poster?我尝试过,但是不起作用。
因此,我阅读了海报的源代码,发现它试图获取类似文件的对象参数的'名称'属性,但是StringIO对象似乎没有'名称'属性,因此,文件名和文件类型为无
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对象的正确方法是什么?
根据this commit,使名称成为可选名称的操作是[[明确地,以支持传入StringIO
对象,但是正如您所发现的,然后跳过了对mime类型的检测,而是默认为text/plain
。
.name
属性设置为goad poster
,即可检测到哑剧类型。替代方法是使用更好的库来发布到Web。我建议您查看requests
,即开箱即用的requests
,包括一种设置文件名的方法。如果传入,则模仿类型将基于该显式文件名。