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

时间:2013-12-26 09:08:48

标签: go

我正在使用beego

开发网站

我正在生成一个zip文件,以便用户从我的网站下载。但是,我不知道何时删除该文件。有没有办法让我知道用户是否已经完成了zip文件的下载,所以我可以从磁盘中删除它?

或者,我可以动态生成zip文件并通过* zip.File到net / http吗? 我看到http.ServeFile()接受了一个ReadSeeker,但我认为zip.File根据文档不满足ReadSeeker接口。

有没有一种方法可以在我的情况下删除文件?

3 个答案:

答案 0 :(得分:2)

导入"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...
    }
}); 

答案 1 :(得分:1)

就像@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()
    })

答案 2 :(得分:0)

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

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

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

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

相关问题