Python Flask - 使所有文件上传到 tmp 目录

rub*_*eet 3 python flask

根据文档,如果文件“相当小”(没有提到上限),Flask 会将上传的文件存储在内存中,否则存储在tempfile.gettempdir().

如何让它将所有文件存储到临时目录?

kmo*_*oor 7

根据Flask文档,上传文件的处理实际上是由其底层werkzeug WSGI 实用程序库处理的。

根据werkzeug 的文档,获取文件位置的下限temp(正如您提到的“相当小”)是500KB

如果总内容长度高于 500KB,默认实现会返回临时文件。由于许多浏览器不提供文件的内容长度,因此只有总内容长度很重要。

我们来看看上限。根据上述Flask文档

默认情况下,Flask 会乐意接受文件上传到无限量的内存,但您可以通过设置配置键来限制MAX_CONTENT_LENGTH

例如,这个代码片段

from flask import Flask, Request
app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
Run Code Online (Sandbox Code Playgroud)

将允许的最大有效负载限制为 16 MB。如果传输较大的文件,Flask 会引发werkzeug.exceptions.RequestEntityTooLarge异常。

现在,回答你的核心问题

如何让它将所有文件存储到临时目录?

您可以通过重写default_stream_factory()函数来做到这一点:

def default_stream_factory(total_content_length, filename, content_type, content_length=None):
    """The stream factory that is used per default."""
    # if total_content_length > 1024 * 500:
    #    return TemporaryFile('wb+')
    # return BytesIO()
    return TemporaryFile('wb+')
Run Code Online (Sandbox Code Playgroud)