Flask如何不使用file.content_type获取文件扩展名并自动新增允许上传类型
实现方案
核心思路
直接从上传文件的原始文件名提取后缀,不需要依赖请求携带的Content-Type(该字段可被伪造,本身可靠性也低),同时维护全局允许后缀列表,自动新增未收录的后缀。
实现步骤
- 导入
os模块用于处理文件名后缀,初始化允许上传的后缀集合(初始值可从原有映射中提取) - 从上传文件对象的
filename属性中提取后缀,统一转为小写避免大小写兼容问题 - 判断后缀是否在允许集合中,不存在则自动新增到集合
- 后续文件名拼接、保存逻辑保持不变
完整可运行代码
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
相关产品推荐
相关产品推荐

