Go语言 如何删除生成的zip文件后,用户完成下载?

dpiehjr4  于 2023-05-20  发布在  Go
关注(0)|答案(3)|浏览(132)

我正在开发一个网站使用beego
我有一个zip文件生成,让用户从我的网站下载。但是,我不知道什么时候删除该文件。有没有一种方法让我知道如果用户已经完成下载的zip文件,所以我可以删除它从磁盘?
或者,我可以生成zip文件,并通过 *zip.File到net/http吗?我看到http.ServeFile()接受一个ReadSeeker,但我认为zip.File不满足ReadSeeker接口。
有没有一个好方法做文件删除我的情况?

mspsb9vt

mspsb9vt1#

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

gg0vcinb2#

您需要在请求处理程序中的某个位置添加defer os.Remove(zf)。用户下载文件与任何其他请求没有什么不同:当请求处理程序完成执行时,您就知道完成了。
这仍然会在磁盘上偶尔留下zip文件(例如,如果您的服务器崩溃,重新启动或以其他方式中断),因此您需要定期运行cron作业或类似作业来删除旧文件。
如果可以一致地重新生成zipfile(例如,这将要求底层数据保持不变或版本化),则可以使用http.ServeContent动态生成zipfile。您可以通过在zip之上编写自己的Seek来实现这一点,它总是重置zip流并向前跳过n个字节。如果有大量的查找,这将是非常低效的,但是你可以拒绝接受范围,然后正好有两个查找:一个到文件的末尾,一个回到文件的开头(这样做是为了计算长度)。
另一个避免磁盘文件的简单方法是在内存中生成zip文件,然后使用strings.Reader通过http.ServeContent提供该文件。不过,使用这种解决方案很难管理服务器中的内存使用。

pw136qt2

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

相关问题