投放静态文件时:
@post('/download')
def downloadpage():
return static_file('tempDS6529QSGYUA41.csv', root='temp', download=True)
在客户端成功100%下载文件后,怎么可能启动操作?
示例:当客户端使用os.remove('tempDS6529QSGYUA41.csv')
成功下载临时文件后,我想删除该临时文件。
注意:如果无法使用Bottle,我可以使用Flask解决方案(我很犹豫是否要迁移到具有相似API的Flask)。
答案 0 :(得分:1)
如果您使用的是Linux或其他类似Unix的操作系统,则可以利用以下事实:当删除保持打开状态的文件(static_file
这样做)时,该文件将从目录中消失,但是操作系统将延迟真正的删除操作,直到不再打开该文件为止。这意味着您无需等待文件被100%下载。
@post('/download')
def downloadpage():
f = static_file('tempDS6529QSGYUA41.csv', root='temp', download=True)
os.remove('tempDS6529QSGYUA41.csv')
return f
或(即使打开文件时发生错误也要执行操作):
@post('/download')
def downloadpage():
try:
return static_file('tempDS6529QSGYUA41.csv', root='temp', download=True)
finally:
os.remove('tempDS6529QSGYUA41.csv')
如果您只想准确执行该操作,并准确地下载了该操作,则应该执行以下操作(忽略某些极端情况):
@post('/download')
def downloadpage():
# Ignore partial download request that would confuse our code
if 'HTTP_RANGE' in request.environ:
del request.environ['HTTP_RANGE']
def wrapper_iterator(f):
for chunk in WSGIFileWrapper(f):
yield f
os.remove('tempDS6529QSGYUA41.csv')
f = static_file('tempDS6529QSGYUA41.csv', root='temp', download=True)
return wrapper_iterator(f)