Python中如何实现上传多个文件的功能?

现在有个需求:实现一个 web 接口,要求输入是 N 个文件,输出是经过处理信息。

目前个人的实现方案是:通过 form-data 接收请求的的文件,然后,经过后端处理,把相关的信息返回给接口调用者。 这里个人有几个疑问:

  1. 使用 form-data 方式上传的信息,我们服务器是等到接收到全部数据,才进行后续处理的吗?(据目前观察是接收到全部文件再进行后续处理)

  2. 如果是接收到全部文件再进行后续的逻辑,那么我们能不能实现服务器接收一个文件就进行后面的逻辑处理?不然在等待接收所有文件信息完成之前,服务器资源很大一部分都闲置,感觉挺浪费。

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)

运行步骤:

  1. 把上面两个文件放在同一个目录下,确保有templates文件夹放HTML
  2. 运行python app.py
  3. 浏览器打开http://127.0.0.1:5000
  4. 选择多个文件后点击上传

关键点说明:

  • HTML里<input type="file" name="files" multiple>multiple属性让用户能选多个文件
  • 后端用request.files.getlist('files')获取文件列表('files'要和HTML里的name一致)
  • 每个文件对象都有.save()方法保存到服务器
  • enctype="multipart/form-data"是必须的,否则文件传不过来

用Flask的getlist处理多文件上传最省事。


文件独立上传,后端侦测文件状态异步处理,前端定期询问相关文件状态。

楼上给的思路很对,后端异步处理文件,前端 ajax 定期检测文件状态就好

回到顶部