我正在开发一个网站使用beego我有一个zip文件生成,让用户从我的网站下载。但是,我不知道什么时候删除该文件。有没有一种方法让我知道如果用户已经完成下载的zip文件,所以我可以删除它从磁盘?或者,我可以生成zip文件,并通过 *zip.File到net/http吗?我看到http.ServeFile()接受一个ReadSeeker,但我认为zip.File不满足ReadSeeker接口。有没有一个好方法做文件删除我的情况?
http.ServeFile()
ReadSeeker
mspsb9vt1#
导入"os"并运行以下行:
"os"
os.Remove(filename)
编辑:我能看到这种情况发生的唯一方法是使用 AJAX 库从API下载文件,然后在完成时调用不同的api。普通 AJAX 调用在这里不起作用,因为所有的浏览器都不允许ajax直接访问磁盘,所以唯一的方法是使用像这样的库http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/。
库API可以通过以下方式利用成功和失败回调之类的东西:
$.fileDownload('/url/to/download.pdf', { successCallback: function (url) { //do another ajax call to delete the file... }, failCallback: function (html, url) { //handle failure... } });
gg0vcinb2#
您需要在请求处理程序中的某个位置添加defer os.Remove(zf)。用户下载文件与任何其他请求没有什么不同:当请求处理程序完成执行时,您就知道完成了。这仍然会在磁盘上偶尔留下zip文件(例如,如果您的服务器崩溃,重新启动或以其他方式中断),因此您需要定期运行cron作业或类似作业来删除旧文件。如果可以一致地重新生成zipfile(例如,这将要求底层数据保持不变或版本化),则可以使用http.ServeContent动态生成zipfile。您可以通过在zip之上编写自己的Seek来实现这一点,它总是重置zip流并向前跳过n个字节。如果有大量的查找,这将是非常低效的,但是你可以拒绝接受范围,然后正好有两个查找:一个到文件的末尾,一个回到文件的开头(这样做是为了计算长度)。另一个避免磁盘文件的简单方法是在内存中生成zip文件,然后使用strings.Reader通过http.ServeContent提供该文件。不过,使用这种解决方案很难管理服务器中的内存使用。
defer os.Remove(zf)
Seek
pw136qt23#
就像@Paul Hankin建议的那样,我只是添加代码。
return middleware.ResponderFunc(func(w http.ResponseWriter, r runtime.Producer) { fn := filepath.Base(filePath) w.Header().Set("Content-Type", "application/octet-stream") w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%q", fn)) io.Copy(w, file) defer os.Remove(filePath) // Path to file you've downloaded. file.Close() })
3条答案
按热度按时间mspsb9vt1#
导入
"os"
并运行以下行:编辑:我能看到这种情况发生的唯一方法是使用 AJAX 库从API下载文件,然后在完成时调用不同的api。普通 AJAX 调用在这里不起作用,因为所有的浏览器都不允许ajax直接访问磁盘,所以唯一的方法是使用像这样的库http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/。
库API可以通过以下方式利用成功和失败回调之类的东西:
gg0vcinb2#
您需要在请求处理程序中的某个位置添加
defer os.Remove(zf)
。用户下载文件与任何其他请求没有什么不同:当请求处理程序完成执行时,您就知道完成了。这仍然会在磁盘上偶尔留下zip文件(例如,如果您的服务器崩溃,重新启动或以其他方式中断),因此您需要定期运行cron作业或类似作业来删除旧文件。
如果可以一致地重新生成zipfile(例如,这将要求底层数据保持不变或版本化),则可以使用http.ServeContent动态生成zipfile。您可以通过在zip之上编写自己的
Seek
来实现这一点,它总是重置zip流并向前跳过n个字节。如果有大量的查找,这将是非常低效的,但是你可以拒绝接受范围,然后正好有两个查找:一个到文件的末尾,一个回到文件的开头(这样做是为了计算长度)。另一个避免磁盘文件的简单方法是在内存中生成zip文件,然后使用strings.Reader通过http.ServeContent提供该文件。不过,使用这种解决方案很难管理服务器中的内存使用。
pw136qt23#
就像@Paul Hankin建议的那样,我只是添加代码。