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

Python3 Flask upload file in server memory

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

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

1: 是否可以将此 FileStorage 对象 "translate" 转换为文件对象?

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

您可以将上传的文件存储到tmpfs。这样它们仍然是常规文件,无法用 open().

打开

传入文件上传确实显示为 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