需求:
1.需要向服务器发送多个同name的文件,如何发送请求
2.服务器后端如何接收到这些同name文件
发送请求样例
requests.post(
url="http://localhost:8080/test",
data={'name':'xiaoming', 'age':18},
files=[
('file', open("files/1.pdf", 'rb')),
('file', open("files/2.pdf", 'rb'))
]
)
这个发送请求效果同postman中
后端接收探索过程
起初我觉得直接这样获取,应该可以拿到一个list,再for循环输出一下其文件名应该可以正常
@app.route('/test', methods=['POST'])
def test():
files = request.files['file']
for each_file in files:
print(each_file.filename)
然而实际上这里的files仅仅只是一个FileStorage文件对象
于是我尝试多探索几个值
令人惊喜的是request.files里面本身是拥有两个同name的文件的,只是之后获取的时候丢失了,而a['file']很明显是dict形式的获取方式,所以我怀疑这里是先转换成了dict之后再获取的,很明显同name的情况下装换成dict不容乐观,必然要丢失数据。
于是上网搜了相关的关键词,反正我是没搜到相关问题。
没办法,自力更生。明显request.files对象是ImmutableMultiDict类的一个示例,搜一下ImmutableMultiDict类,其来自werzeug.datastructures包中,来看一眼ImmutableMultiDict类的源码。
意料之中的什么也没有呢,那只能找其父类啦
其中ImmutableMultiDictMixin类也出乎意料的好像什么也没有呢
只剩下MultiDict类了,我只能暗暗祈祷,然后!
我没看其实现逻辑,也没看介绍!我只知道这个方法名!getlist!这个方法的参数!key!
那么假如我这样调用是不是就能得到name为file的文件列表了???!!!
request.files.getlist('file')
结果显而易见