使用Python Flask将多文件上传至Azure Blob的问题排查
问题解决方案
问题分析
- 仅第一个文件能上传:现有代码只处理了
name="file"的文件输入框,完全未对name="file1"的第二个输入框做上传逻辑处理。 - UnboundLocalError报错:
msg变量仅在第一个文件上传成功的分支中定义,当跳过第一个文件(或上传失败)时,msg未被初始化就直接返回,触发变量未定义错误。
修复步骤
- 初始化msg变量:在
upload函数开头就定义msg,确保所有分支都能访问到该变量。 - 添加第二个文件的上传逻辑:获取
file1的文件对象,复用上传逻辑(可封装成通用函数减少代码冗余)。 - 完善提示信息:在异常分支、文件不合法分支中添加对应提示,让用户明确操作结果。
修改后的代码
Python后端代码
from flask import request, render_template from werkzeug.utils import secure_filename from azure.storage.blob import BlobServiceClient import os # 以下变量需提前配置 connect_str = "你的Azure存储连接字符串" container = "你的Blob容器名称" allowed_ext = {"png", "jpg", "jpeg", "gif", "pdf"} # 自定义允许的文件扩展名 blob_service_client = BlobServiceClient.from_connection_string(connect_str) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in allowed_ext # 封装通用上传函数,避免重复代码 def upload_to_azure(file, container_name): if not file or not allowed_file(file.filename): return False, "文件不合法或未选择文件" filename = secure_filename(file.filename) file.save(filename) blob_client = blob_service_client.get_blob_client(container=container_name, blob=filename) try: with open(filename, "rb") as data: blob_client.upload_blob(data, overwrite=True) os.remove(filename) return True, f"{filename} 上传成功!" except Exception as e: os.remove(filename) return False, f"{filename} 上传失败:{str(e)}" @app.route('/upload', methods=['POST']) def upload(): msg = "" # 初始化msg,彻底解决未定义报错问题 if request.method == 'POST': # 处理第一个文件 file1_result = upload_to_azure(request.files.get('file'), container) msg += file1_result[1] + "<br>" # 处理第二个文件 file2_result = upload_to_azure(request.files.get('file1'), container) msg += file2_result[1] return render_template("dashboard.html", msg=msg)
HTML前端代码(仅需修改提示渲染部分)
<div class="card" style="width:400px"> <div class="card-body "> <form action="/upload" method="POST" enctype="multipart/form-data"> <input type="file" name="file" value="file"> <input type="file" name="file1" value="file1"> <hr> <input type="submit" name="upload" value="Upload" class="btn btn-success"> </form> {{msg|safe}} <!-- 添加|safe使换行标签生效 --> </div>
关键改动说明
- 封装
upload_to_azure函数:将重复的上传逻辑抽离,代码更简洁易维护。 - 初始化
msg变量:函数开头定义msg,确保所有执行分支都能正常返回该变量。 - 双文件处理:分别调用上传函数处理两个文件输入框的内容,拼接结果到提示信息中。
- 前端
|safe标记:让提示中的<br>标签生效,实现两个文件上传结果的换行显示。
内容的提问来源于stack exchange,提问作者Vojjala Shivani
相关产品推荐
相关产品推荐

