将Flask FileStorage对象转换为File对象

最近要给后台增加一个微信素材管理功能,需求很简单,接口文档在这上传图文消息内的图片获取URL | 微信开放文档

但在实际开发过程中,图片老是传不上去,提示参数错误。

上传用的是requests包,对应上传代码大约是:

file=request.files['fileName']
requests.post(url,files={'media':file})

但是,报错了,微信公众平台要求media是个File对象, 我们的后台是基于Python flask的,获取的文件实际是一个FileStorage对象,并不是File对象。

所以最简单的办法就是将FileStorage对象转换成File对象.

然而,这个过程及其痛苦,我几乎尝试遍了网上所有的办法,都不能成功。传的最广的是这篇内容https://stackoverflow.com/questions/39437909/flask-filestorage-object-to-file-object, 但是很遗憾,照样不行。

我一度想放弃,采用最原始的办法,如:

file = request.files.get('fileName', None)
file_path = '/tmp/xxx'
file.save(file_path)
requests.post(url,files={'media':open(file_path)})

这种方法当然是可行的,而且能上传成功的,但就是太蠢了,先得将文件保存到硬盘,然后再读取文件并上传。

后来无意中看了眼requests的源码,发现有tuple的写法.

微信老报错,是因为我构造的File对象缺乏filename、filelength、content-type 等信息。

我只要补上是否就可以呢?


file = request.files.get('fileName', None)
if file is None:
    raise 
f = (file.filename, file.stream, file.content_type)
requests.post(url,files={'media':f})

最后发现,可以正常运行了。