Python3 Flask上传文件在服务器内存中

pid*_*gey 1 python memory file flask python-3.x

我在Python3中使用Flask作为网络服务器,并使用Flask的上传功能。将文件上传到服务器会生成一个werkzeug.datastructures.FileStorage对象。

我需要这个文件的功能之一,还需要能够从路径对象打开文件,所以目前,我正在使用open(file_to_open). 如果可能的话,我想避免将上传的文件写入临时文件,只是为了再次读取它。所以我的问题由两部分组成:

1:是否可以将此 FileStorage 对象“翻译”为文件对象?

2:如果是这样,这也适用于当前代码(open(file_to_open))吗?

Mar*_*ers 5

传入的文件上传确实以对象的形式呈现FileStorage。然而,这并不一定意味着涉及实际的物理文件。

解析文件对象时,Werkzeug 使用stream_factory()可调用函数来生成文件对象。默认实现仅创建 500kb 及以上文件大小的实际物理文件,以避免耗尽内存。

对于较小的文件,则使用内存中的文件对象。

我不会篡改这个安排;因为它现在可以正常工作,所以问题的处理是透明的,并且只有当文件上传会给您的内存带来太多负担时才会涉及您的硬盘。

相反,我会更改该函数以不需要文件名和/或接受文件对象。

如果您的函数只能将路径包含的数据作为字符串,您可以通过内省底层属性来查看是否需要读取文件.stream

from werkzeug._compat import BytesIO

filename = data = None
if file_upload.filename is None:
    data = file_upload.read()  # in-memory stream, so read it out.
else:
    filename = file_upload.filename
Run Code Online (Sandbox Code Playgroud)