Flask框架调用send_file返回文件后如何删除服务器端源文件
你之前的写法错误原因有两点:一是send_file仅构造响应对象,并不会直接把文件发送给客户端,只有当你把这个对象返回给Flask框架后,框架才会执行发送逻辑;二是Flask视图不允许返回整数类型,所以抛出了类型错误。
正确实现方案
方案1:使用after_this_request回调(推荐,适配全场景)
Flask提供的after_this_request装饰器可以注册回调函数,该函数会在响应完全发送给客户端之后才执行,不会影响文件读取逻辑,也不会提前删除文件。
示例代码:
from flask import after_this_request import os # 以下写在你的视图函数内部 @after_this_request def remove_file(response): try: os.remove(pathAndFilename) except Exception as e: # 这里可以加日志记录删除错误,避免程序崩溃 app.logger.error(f"删除文件失败: {pathAndFilename}, 错误信息: {e}") # 必须返回response对象 return response return send_file(pathAndFilename, as_attachment=True, attachment_filename=requestedFile)
方案2:读取文件到内存后删除再返回(适用于小文件场景)
如果要发送的文件体积较小,可以先把文件内容全部读取到内存中,删除源文件后再构造响应返回内存中的内容。
示例代码:
import os from flask import Response # 以下写在你的视图函数内部 # 先读取文件全部内容到内存 with open(pathAndFilename, 'rb') as f: file_content = f.read() # 读取完成后直接删除本地源文件 os.remove(pathAndFilename) # 构造附件响应返回内存中的内容 return Response( file_content, headers={ "Content-Disposition": f"attachment; filename={requestedFile}" }, mimetype="application/octet-stream" )
注意事项
- 方案1不会额外占用服务器内存,支持大文件传输,是首选实现方案
- 方案2仅适合文件体积较小的场景,大文件读取到内存会导致服务器内存占用过高甚至崩溃
- 如果是动态生成的临时文件,建议使用
tempfile模块生成带唯一标识的文件名,避免多请求并发时出现文件重名、误删的问题 - 操作文件时建议使用绝对路径,避免相对路径导致的读写、删除权限错误
内容的提问来源于stack exchange,提问作者user1584421
相关产品推荐
相关产品推荐

