我正在Python3中使用Flask作为网络服务器,并正在使用Flask的上传功能。将文件上载到服务器会产生一个werkzeug.datastructures.FileStorage
对象。
我需要此文件的功能之一,还需要能够从路径对象中打开文件,因此,我现在正在使用open(file_to_open)
。如果可能的话,我想避免将上传的文件写入临时文件,而只是再次读入。所以我的问题包括两部分:
1:是否可以将此FileStorage对象“翻译”为文件对象?
2:如果是这样,这是否也适用于当前代码(open(file_to_open)
)?
传入的文件上传确实是作为FileStorage
对象呈现的。然而,这并没有一定意味着实际的物理文件是参与。
解析文件对象时,Werkzeug使用stream_factory()
Callable来生成文件对象。默认实现只为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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句