Flask 提供文件后删除文件

Posted

技术标签:

【中文标题】Flask 提供文件后删除文件【英文标题】:Remove file after Flask serves it 【发布时间】:2017-04-12 16:48:53 【问题描述】:

我有一个 Flask 视图,它生成数据并使用 Pandas 将其保存为 CSV 文件,然后显示数据。第二个视图为生成的文件提供服务。我想在下载文件后删除它。我当前的代码引发了权限错误,可能是因为after_request 在使用send_from_directory 提供文件之前删除了该文件。送达后如何删除文件?

def process_data(data)
    tempname = str(uuid4()) + '.csv'
    data['text'].to_csv('samo/static/temp/'.format(tempname))
    return file

@projects.route('/getcsv/<file>')
def getcsv(file):
    @after_this_request
    def cleanup(response):
        os.remove('samo/static/temp/' + file)
        return response

    return send_from_directory(directory=cwd + '/samo/static/temp/', filename=file, as_attachment=True)

【问题讨论】:

【参考方案1】:

after_request 在视图返回之后但在响应发送之前运行。发送文件可能会使用流式响应;如果您在完全阅读之前删除它,您可能会遇到错误。

这主要是 Windows 上的问题,其他平台可以将文件标记为已删除并保留它直到它不被访问。但是,无论平台如何,仅在确定文件已发送后才删除文件可能仍然有用。

将文件读入内存并提供服务,这样您以后删除它时就不会读取它。如果文件太大而无法读入内存,请使用生成器提供服务然后将其删除。

@app.route('/download_and_remove/<filename>')
def download_and_remove(filename):
    path = os.path.join(current_app.instance_path, filename)

    def generate():
        with open(path) as f:
            yield from f

        os.remove(path)

    r = current_app.response_class(generate(), mimetype='text/csv')
    r.headers.set('Content-Disposition', 'attachment', filename='data.csv')
    return r

【讨论】:

以上是关于Flask 提供文件后删除文件的主要内容,如果未能解决你的问题,请参考以下文章

删除数据库文件和sqllocaldb后,底层提供程序在Open上失败

永久删除文件后如何恢复文件

uplodify上传成功后,删除文件

flask-migrate

雨后清风教你将回收站设置为在Windows10中立即永久删除文件

恢复HDFS文件删除后的方法