问题描述
我正在尝试在接收文件时绕过任何本地存储。根据{{3}},如果“合理”,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)来更改内存阈值。
内存是比磁盘空间更有限的共享资源,因此将所有内容存储在内存中通常不是一个好主意。没有理由不使用临时文件。