You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python Flask将多文件上传至Azure Blob的问题排查

问题解决方案

问题分析

  1. 仅第一个文件能上传:现有代码只处理了name="file"的文件输入框,完全未对name="file1"的第二个输入框做上传逻辑处理。
  2. UnboundLocalError报错:msg变量仅在第一个文件上传成功的分支中定义,当跳过第一个文件(或上传失败)时,msg未被初始化就直接返回,触发变量未定义错误。

修复步骤

  1. 初始化msg变量:在upload函数开头就定义msg,确保所有分支都能访问到该变量。
  2. 添加第二个文件的上传逻辑:获取file1的文件对象,复用上传逻辑(可封装成通用函数减少代码冗余)。
  3. 完善提示信息:在异常分支、文件不合法分支中添加对应提示,让用户明确操作结果。

修改后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:40:51