为了账号安全,请及时绑定邮箱和手机立即绑定

Golang如何在用户完成下载后删除生成的zip文件?

Golang如何在用户完成下载后删除生成的zip文件?

Go
元芳怎么了 2021-06-30 17:11:19
我正在使用beego开发一个网站我正在生成一个 zip 文件,让用户从我的网站下载。但是,我不知道何时删除该文件。有没有办法让我知道用户是否已完成下载 zip 文件,以便我可以从磁盘中删除它?或者,我可以即时生成 zip 文件并将 *zip.File 传递到 net/http 吗?我看到http.ServeFile()接受 ReadSeeker,但我认为 zip.FileReadSeeker根据文档不满足接口。有没有什么好方法可以根据我的情况删除文件?
查看完整描述

3 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

我只是在添加代码。


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()

    })


查看完整回答
反对 回复 2021-07-12
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

您需要defer os.Remove(zf)在请求处理程序中的某个位置。用户下载文件与任何其他请求没有什么不同:当请求处理程序完成执行时,您就知道您已经完成了。

这仍然会在磁盘上留下偶尔的 zip 文件(例如,如果您的服务器崩溃、重新启动或以其他方式中断),因此您将需要一个 cron 作业或类似的工作来定期运行以删除旧文件。

如果您可以一致地重新生成 zip 文件,则可以使用 http.ServeContent 动态生成 zip 文件(例如,这将要求您的基础数据保持不变或版本化)。您可以通过Seek在 zip 之上编写自己的代码来完成此操作,该zip 始终会重置 zip 流并向前跳过 n 个字节。如果有很多搜索,这将是非常低效的,但是您可以拒绝接受范围,然后就会有两个搜索:一个到文件末尾,另一个回到开头(完成以计算长度) .

另一种避免磁盘文件的简单方法是在内存中生成 zip 文件,然后使用 strings.Reader 通过 http.ServeContent 为其提供服务。但是,使用此解决方案管理服务器中的内存使用会很困难。


查看完整回答
反对 回复 2021-07-12
  • 3 回答
  • 0 关注
  • 533 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信