You need to enable JavaScript to run this app. Flask如何不使用file.content_type获取文件扩展名并自动新增允许上传类型
优惠活动
大模型
产品
解决方案
定价
更多

Flask如何不使用file.content_type获取文件扩展名并自动新增允许上传类型

实现方案

核心思路

直接从上传文件的原始文件名提取后缀,不需要依赖请求携带的Content-Type(该字段可被伪造,本身可靠性也低),同时维护全局允许后缀列表,自动新增未收录的后缀。

实现步骤

  1. 导入os模块用于处理文件名后缀,初始化允许上传的后缀集合(初始值可从原有映射中提取)
  2. 从上传文件对象的filename属性中提取后缀,统一转为小写避免大小写兼容问题
  3. 判断后缀是否在允许集合中,不存在则自动新增到集合
  4. 后续文件名拼接、保存逻辑保持不变

完整可运行代码

import os
from flask import Flask, request, redirect

app = Flask(__name__)

# 初始化允许的后缀集合,从原有映射提取初始值
ALLOWED_EXTENSIONS = {".png", ".gif", ".jpeg", ".txt", ".html", ".mp3", ".mp4", ".py", ".exe"}

# 你原有生成文件名的方法,这里补个示例实现避免报错
def generate_name():
    import uuid
    return str(uuid.uuid4().hex)

@app.route("/mobile/upload", methods=["POST"])
async def upload_file():
    uploaded_files = await request.files
    uploaded_file = uploaded_files['file']
    uploaded_file_name = generate_name()
    
    # 提取文件后缀,转小写
    _, ext = os.path.splitext(uploaded_file.filename)
    ext = ext.lower()

    # 无后缀的文件可以根据需求自行处理,这里示例直接返回错误
    if not ext:
        return "不支持无后缀的文件上传"
    
    # 自动新增未收录的后缀到允许列表
    if ext not in ALLOWED_EXTENSIONS:
        ALLOWED_EXTENSIONS.add(ext)
    
    full_name = uploaded_file_name + ext
    await uploaded_file.save("./static/" + full_name)
    return redirect("/static/" + full_name)

注意事项

  • 自动新增所有后缀会有安全风险,比如允许上传.php、.exe等可执行文件可能被利用,建议根据业务场景增加后缀黑白名单限制
  • 生产环境建议对上传文件做二次校验,比如图片类文件验证文件头避免伪装的恶意文件

内容的提问来源于stack exchange,提问作者GreenDiscord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 12:57:02