如何从磁盘读取 jpeg 并将其实例化为“werkzeug.datastructs.FileStorage”?

问题描述 投票:0回答:1
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
范围之外?

python file werkzeug
1个回答
0
投票

您可以使用内存中的字节缓冲区。

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)
© www.soinside.com 2019 - 2024. All rights reserved.