Flask:发送一个zip文件,然后将其删除

时间:2019-09-15 15:06:42

标签: python flask zip zipfile

我正在使用flask应用程序,该应用程序从Web服务器中的文件夹中获取多个文件,并创建一个包含这些文件的zip文件,以最终将该zip文件发送给用户。我的问题是,发送后我无法从Web服务器删除zip文件。

我尝试使用@after_this_request命令解决问题。

在这里,我显示了我编写的代码的简化版本。我发送以前创建的zip文件,然后尝试将其删除。

@app.route('/sendFile')
def sendFile():
    @after_this_request
    def removeFile(response):
        os.remove(zip_path)
        return response

    return send_from_directory(path, filename=zipname, as_attachment=True)

问题是出现了一个错误,指出无法删除该zip文件,因为该文件仍在被其他进程使用。我已经看到其他类型文件的类似问题:

Flask - delete file after download

Remove file after Flask serves it

但是,在我看来,它们不适用于zip文件。

1 个答案:

答案 0 :(得分:2)

您可以按字节读取文件,删除zip,然后使用flask.Response流式传输响应。这样的事情可能会起作用:

from flask import Response

@app.route('/sendFile')
def sendFile():
    with open(os.path.join(path, zipname), 'rb') as f:
        data = f.readlines()
    os.remove(os.path.join(path, zipname))
    return Response(data, headers={
        'Content-Type': 'application/zip',
        'Content-Disposition': 'attachment; filename=%s;' % zipname
    })