python 3.10.11
werkzeug 2.3.7
I have a jpeg in /mnt/dragon.jpeg
I want to write unit test for a method, which has werkzeug.datastructures.FileStorage as input, and behavior is save it to a path.
I try to instantiate it with codes below:
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)
The ipython instance output are:
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
How to make the werkzeug.datastructures.FileStorage file can be saved outside the scope of open?
You can use in-memory bytes buffer(
io.BytesIO). The current problem with your code is that python closes the underlying file as soon as thewithblock completes its execution.