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
我在 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