首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask-Uploads:如何通过内容(而不仅仅是扩展名)强制文件类型

Flask-Uploads:如何通过内容(而不仅仅是扩展名)强制文件类型
EN

Stack Overflow用户
提问于 2020-02-04 10:08:45
回答 1查看 226关注 0票数 0

我正在使用Flask-Uploads来处理web应用程序中的图像上传。web应用程序只接受JPEG图像,但似乎Flask-Uploads只通过检查文件扩展名来执行此操作。

例如,我可以很容易地将文件名从myfile.txt更改为myfile.jpg,这样文本文件myfile.txt就会被错误地接受为JPEG图像。

如何确保上传到我的web应用程序的文件实际上是按内容而不是仅按文件扩展名的JPEG文件?

下面是一个最小的实现(不包括模板),它演示了我想要做的事情:

代码语言:javascript
复制
# __init__.py

from flask import Flask
from flask_uploads import UploadSet, configure_uploads, IMAGES
from config import Config

app = Flask(__name__)
app.config.from_object(Config)

photos = UploadSet("photos", IMAGES)
configure_uploads(app, photos)

from app import routes
代码语言:javascript
复制
# routes.py

import os
from flask import redirect, render_template, send_from_directory, url_for
from flask_uploads import UploadNotAllowed
from app import app, photos
from app.forms import PhotoForm


@app.route('/', methods=["GET", "POST"])
def index():
    form = PhotoForm()
    if form.validate_on_submit():
        try:
            filename = photos.save(form.photo.data)
            return redirect(url_for("uploaded_file", filename=filename))
        except UploadNotAllowed:
            print("UploadNotAllowed!")
            redirect(url_for("index"))
    return render_template("index.html", form=form)


@app.route("/uploads/<filename>")
def uploaded_file(filename):
    directory = os.path.join(os.getcwd(), app.config["UPLOADED_PHOTOS_DEST"])
    return send_from_directory(directory, filename)
代码语言:javascript
复制
# forms.py

from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired
from wtforms import SubmitField


class PhotoForm(FlaskForm):
    photo = FileField(validators=[FileRequired()])
    submit = SubmitField("Upload")
代码语言:javascript
复制
# config.py

import os


class Config(object):
    SECRET_KEY = os.environ.get("SECRET_KEY")
    UPLOADED_PHOTOS_DEST = "uploads"
    UPLOADED_PHOTOS_DENY = ["bmp", "gif", "png", "svg"]
EN

回答 1

Stack Overflow用户

发布于 2020-07-02 21:51:08

您可以导入UploadSet并-如文档字符串中所述-覆盖file_allowed方法,例如创建自己的类,继承UploadSet

然后,您可以从几个Python库中选择一个,它可以检测类型,例如https://github.com/ahupp/python-magic

附言:至少在PyPi包中,Flask-Uploads在2020年2月就已经崩溃了。我创建了一个fork,这是一个可以通过https://pypi.org/project/Flask-Reuploaded/下载的替代工具

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60049631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档