gpt4 book ai didi

python - 使用 Flask-Uploads 拒绝超过一定数量的文件?

转载 作者:行者123 更新时间:2023-12-01 04:34:57 25 4
gpt4 key购买 nike

Flask 推荐使用 Flask-Uploads 模块来处理上传。我想拒绝任何超过一定大小的文件。有一些解决方案:

From the docs :

In addition, you can also use patch_request_class to patch your app’s request_class to have a maximum size for uploads.

patch_request_class(app, 32 * 1024 * 1024)

From this SO post :

MAX_CONTENT_LENGTH is the correct way to reject file uploads larger than you want,

app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

# save to disk first, then check filesize
request.files['file'].save('/tmp/foo')
size = os.stat('/tmp/foo').st_size

-或-

# save to memory, then check filesize
blob = request.files['file'].read()
size = len(blob)

我没有看到官方文档中提到MAX_CONTENT_LENGTH,也没有像SO帖子那样手动检查文件大小。这两种方法最终是相同的,还是存在(大/细微?)差异?另外,patch_request_class 是先将文件保存到磁盘以确定总上传大小,还是保存到内存?

最佳答案

MAX_CONTENT_LENGTH是Flask本身的一个配置项,0.6版本引入 http://flask.pocoo.org/docs/0.10/patterns/fileuploads/#improving-uploads

By default Flask will happily accept file uploads to an unlimited amount of memory, but you can limit that by setting the MAX_CONTENT_LENGTH config key:

from flask import Flask, Request

app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

The code above will limited the maximum allowed payload to 16 megabytes. If a larger file is transmitted, Flask will raise an RequestEntityTooLarge exception.

This feature was added in Flask 0.6 but can be achieved in older versions as well by subclassing the request object. For more information on that consult the Werkzeug documentation on file handling.

来自 flask 上传源: https://bitbucket.org/leafstorm/flask-uploads/src/440e06b851d24811d20f8e06a8eaf5c5bf58c241/flaskext/uploads.py?at=default

def patch_request_class(app, size=64 * 1024 * 1024):
"""
By default, Flask will accept uploads to an arbitrary size. While Werkzeug
switches uploads from memory to a temporary file when they hit 500 KiB,
it's still possible for someone to overload your disk space with a
gigantic file.

This patches the app's request class's
`~werkzeug.BaseRequest.max_content_length` attribute so that any upload
larger than the given size is rejected with an HTTP error.

.. note::

In Flask 0.6, you can do this by setting the `MAX_CONTENT_LENGTH`
setting, without patching the request class. To emulate this behavior,
you can pass `None` as the size (you must pass it explicitly). That is
the best way to call this function, as it won't break the Flask 0.6
functionality if it exists.

.. versionchanged:: 0.1.1

:param app: The app to patch the request class of.
:param size: The maximum size to accept, in bytes. The default is 64 MiB.
If it is `None`, the app's `MAX_CONTENT_LENGTH` configuration
setting will be used to patch.
"""
if size is None:
if isinstance(app.request_class.__dict__['max_content_length'],
property):
return
size = app.config.get('MAX_CONTENT_LENGTH')
reqclass = app.request_class
patched = type(reqclass.__name__, (reqclass,),
{'max_content_length': size})
app.request_class = patched

所以我会说:

app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

关于python - 使用 Flask-Uploads 拒绝超过一定数量的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31873989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com