【发布时间】:2021-01-21 19:31:50
【问题描述】:
我正在尝试在接收文件时绕过任何本地存储。根据documentation,如果“合理”,Flask 会将文件保存在内存中,否则将它们存储在临时位置。
我只找到了一种通常使用MAX_CONTENT_LENGTH 来限制请求大小的方法。如何控制单个文件大小的阈值,或完全禁止使用临时文件?
【问题讨论】:
我正在尝试在接收文件时绕过任何本地存储。根据documentation,如果“合理”,Flask 会将文件保存在内存中,否则将它们存储在临时位置。
我只找到了一种通常使用MAX_CONTENT_LENGTH 来限制请求大小的方法。如何控制单个文件大小的阈值,或完全禁止使用临时文件?
【问题讨论】:
Request._get_file_stream 方法用于获取类文件对象以存储文件上传。默认实现使用SpooledTemporaryFile,限制为500 KiB,在写入常规临时文件之前将数据保留在内存中。
子类化并覆盖该方法以始终返回BytesIO。告诉 Flask 应用使用该类而不是默认类。
from flask.wrappers import Request
class MemoryRequest(Request):
def _get_file_stream(self, total_content_length, content_type, filename, content_length):
return BytesIO()
app.request_class = MemoryRequest
您还可以通过返回 SpooledTemporaryFile(max_size=100_000_000, mode="rb+")(例如 100 MB)来更改内存阈值。
内存是比磁盘空间更有限的共享资源,因此将所有内容存储在内存中通常不是一个好主意。没有理由不使用临时文件。
【讨论】: