Python中如何实现上传多个文件的功能?
现在有个需求:实现一个 web 接口,要求输入是 N 个文件,输出是经过处理信息。
目前个人的实现方案是:通过 form-data 接收请求的的文件,然后,经过后端处理,把相关的信息返回给接口调用者。 这里个人有几个疑问:
-
使用 form-data 方式上传的信息,我们服务器是等到接收到全部数据,才进行后续处理的吗?(据目前观察是接收到全部文件再进行后续处理)
-
如果是接收到全部文件再进行后续的逻辑,那么我们能不能实现服务器接收一个文件就进行后面的逻辑处理?不然在等待接收所有文件信息完成之前,服务器资源很大一部分都闲置,感觉挺浪费。
PS:服务端解决方案不限框架(flask, Django, aiohttp, tornado, sanic),目前个人用 Flask 实现。
谢谢!
Python中如何实现上传多个文件的功能?
3 回复
在Python里上传多个文件,用Flask框架配合HTML的<input type="file" multiple>属性最直接。后端用request.files.getlist()就能拿到所有文件对象。
下面是个完整的例子:
1. 先装Flask(如果还没装的话):
pip install flask
2. 创建HTML文件(templates/upload.html):
<!DOCTYPE html>
<html>
<body>
<form method="POST" action="/upload" enctype="multipart/form-data">
<input type="file" name="files" multiple>
<input type="submit" value="上传">
</form>
</body>
</html>
3. 创建Python后端(app.py):
from flask import Flask, request, render_template
import os
app = Flask(__name__)
UPLOAD_FOLDER = 'uploads'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
@app.route('/')
def index():
return render_template('upload.html')
@app.route('/upload', methods=['POST'])
def upload_files():
files = request.files.getlist('files')
if not files or files[0].filename == '':
return '没有选择文件'
saved_files = []
for file in files:
if file.filename:
filepath = os.path.join(UPLOAD_FOLDER, file.filename)
file.save(filepath)
saved_files.append(file.filename)
return f'成功上传了 {len(saved_files)} 个文件: {", ".join(saved_files)}'
if __name__ == '__main__':
app.run(debug=True)
运行步骤:
- 把上面两个文件放在同一个目录下,确保有
templates文件夹放HTML - 运行
python app.py - 浏览器打开
http://127.0.0.1:5000 - 选择多个文件后点击上传
关键点说明:
- HTML里
<input type="file" name="files" multiple>的multiple属性让用户能选多个文件 - 后端用
request.files.getlist('files')获取文件列表('files'要和HTML里的name一致) - 每个文件对象都有
.save()方法保存到服务器 enctype="multipart/form-data"是必须的,否则文件传不过来
用Flask的getlist处理多文件上传最省事。
文件独立上传,后端侦测文件状态异步处理,前端定期询问相关文件状态。


