python 3.10.11
werkzeug 2.3.7
我有一个jpeg
/mnt/dragon.jpeg
我想为一个方法编写单元测试,该方法以
werkzeug.datastructures.FileStorage
作为输入,行为是将其保存到路径中。
我尝试用下面的代码实例化它:
import os
from werkzeug.datastructures import FileStorage
PATH = "/mnt/dragon.jpeg"
def get_file(filepath: str) -> FileStorage:
filename = os.path.basename(filepath)
with open(filepath, 'rb') as file:
return FileStorage(file, name=filename)
file = get_file(PATH)
ipython 实例输出为:
In [8]: file
Out[8]: <FileStorage: '/mnt/dragon.jpeg' (None)>
In [9]: file.save("/mnt/saved.jpeg")
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[9], line 1
----> 1 file.save("/mnt/saved.jpeg")
File ~/.local/lib/python3.10/site-packages/werkzeug/datastructures/file_storage.py:129, in FileStorage.save(self, dst, buffer_size)
126 close_dst = True
128 try:
--> 129 copyfileobj(self.stream, dst, buffer_size)
130 finally:
131 if close_dst:
File ~/miniconda3/lib/python3.10/shutil.py:195, in copyfileobj(fsrc, fdst, length)
193 fdst_write = fdst.write
194 while True:
--> 195 buf = fsrc_read(length)
196 if not buf:
197 break
ValueError: read of closed file
如何让
werkzeug.datastructures.FileStorage
文件可以保存在open
范围之外?
您可以使用内存中的字节缓冲区。
import os
import io
from werkzeug.datastructures import FileStorage
PATH = "/mnt/dragon.jpeg"
def get_file(filepath: str) -> FileStorage:
filename = os.path.basename(filepath)
with open(filepath, 'rb') as file:
return FileStorage(io.BytesIO(file.read()), name=filename)
file = get_file(PATH)