在Flask中,如何发送临时文件并在上传完成后将其删除?

时间:2019-06-13 13:33:22

标签: python flask

我正在编写一个小型Flask服务器,该服务器: 1.接收图像并将其保存到临时目录中, 2.进行一些处理以生成修改后的图像,并且 3.发回修改后的图像。

结构可以概括为:

@app.route('/process_file', methods=['POST'])
def process_file():
    file = request.files['file']

    with tempfile.TemporaryDirectory() as tmpdirname:

        file.save(os.path.join(tmpdirname, "original.png"))

        # ...
        # Do a lot of stuff to produce a new "modified.png", in the same dir
        # ...

        ret_path = os.path.join(tmpdirname, "modified.png")
        return send_file(filename_or_fp=ret_path, mimetype="image/png")

在Linux上,一切正常。

但是,在Windows上,在系统尝试删除临时目录时收到错误消息。

以下是我们在删除临时目录期间遇到的堆栈错误的选择:

File "C:\Users\hapr00\AppData\Local\Programs\Python\Python37\lib\tempfile.py", line 805, in __exit
__
   self.cleanup()
 File "C:\Users\hapr00\AppData\Local\Programs\Python\Python37\lib\tempfile.py", line 809, in cleanu
p
   _shutil.rmtree(self.name)
 File "C:\Users\hapr00\AppData\Local\Programs\Python\Python37\lib\shutil.py", line 513, in rmtree
   return _rmtree_unsafe(path, onerror)
 File "C:\Users\hapr00\AppData\Local\Programs\Python\Python37\lib\shutil.py", line 397, in _rmtree_
unsafe
   onerror(os.unlink, fullname, sys.exc_info())
 File "C:\Users\hapr00\AppData\Local\Programs\Python\Python37\lib\shutil.py", line 395, in _rmtree_
unsafe
   os.unlink(fullname)
PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem ande
ren Prozess verwendet wird: 'path/to/the/modified.png'

英语是这样的:“该进程无法访问文件,因为它已被另一个进程使用。”

我的理解

看起来send_file是异步的,因此Python试图在另一个线程仍在上传文件的同时删除该临时目录。 在Linux上,这不会发生,因为仅删除了文件名,而文件节点在其他线程完成上传文件之前仍然处于活动状态。

问题: 一个人将如何重新组织代码以正确处理这种情况?

(不,至少在目前,切换到Linux服务器不是解决方案)

0 个答案:

没有答案