我正在使用beego开发一个网站
我有一个压缩文件生成,让用户从我的网站下载。但是,我不知道什么时候删除文件。有没有办法让我知道用户是否下载完了zip文件,这样我就可以把它从磁盘上删除了?
或者,我可以动态生成压缩文件并通过*zip.File转换为net/http吗?我看到http.ServeFile()接受ReadSeeker,但根据文档,我认为zip.File不满足ReadSeeker接口。
对于我的情况,有没有好的删除文件的方法?
发布于 2013-12-26 18:00:02
导入"os"并运行以下行:
os.Remove(filename)api :我看到这种情况发生的唯一方式是使用ajax库从下载文件,然后在完成时调用不同的。普通的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...
}
}); 发布于 2013-12-26 21:41:35
您需要在请求处理程序中的某个位置执行defer os.Remove(zf)。
这仍然会将偶尔的zip文件留在磁盘上(例如,如果您的服务器崩溃、重新启动或以其他方式中断),因此您需要定期运行cron作业或类似作业来删除旧文件。
如果能够一致地重新生成压缩文件(例如,这将要求底层数据不变或版本化),则可以使用http.ServeContent动态生成压缩文件。如果有大量的查找,这将是非常低效的,但是您可以拒绝接受范围,然后恰好会有两个查找:一个到文件末尾,另一个回到开头(用来计算长度)。
另一种避免磁盘文件的简单方法是在内存中生成压缩文件,然后使用strings.Reader通过http.ServeContent为其提供服务。不过,使用此解决方案很难管理服务器中的内存使用情况。
发布于 2020-04-29 20:19:27
就像@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()
})https://stackoverflow.com/questions/20782077
复制相似问题