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

Golang用户完成下载后如何删除生成的zip文件?,go,Go,我正在开发一个网站使用 我有一个zip文件生成,让用户从我的网站下载。但是,我不知道什么时候删除该文件。有没有办法让我知道用户是否已经下载完zip文件,这样我就可以从磁盘上删除它 或者,我可以动态生成zip文件并将*zip.file转换为net/http吗? 我看到http.ServeFile()接受一个readseek,但根据文档,我认为zip.File不满足readseek接口 在我的情况下,有没有一种好方法可以删除文件?导入“os”并运行以下行: os.Remove(filename)

我正在开发一个网站使用

我有一个zip文件生成,让用户从我的网站下载。但是,我不知道什么时候删除该文件。有没有办法让我知道用户是否已经下载完zip文件,这样我就可以从磁盘上删除它

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

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

导入
“os”
并运行以下行:

os.Remove(filename)
编辑:我看到这种情况的唯一方法是使用ajax库从api下载文件,然后在完成时调用其他api。普通的ajax调用在这里不起作用,因为所有浏览器都不允许ajax直接访问磁盘,所以实现这一点的唯一方法是使用这样的库

库api可以通过以下方式利用成功和失败回调:

$.fileDownload('/url/to/download.pdf', {
    successCallback: function (url) {

        //do another ajax call to delete the file...
    },
    failCallback: function (html, url) {
        //handle failure...
    }
}); 

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

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

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


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

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

…我知道如何删除文件。我不知道的是如何知道用户完成了下载,这样我就可以使用os.Remove(文件名)删除zip文件。谢谢你的回答,我知道了。我会调整我的答案。