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()
})
TA贡献2065条经验 获得超14个赞
您需要defer os.Remove(zf)
在请求处理程序中的某个位置。用户下载文件与任何其他请求没有什么不同:当请求处理程序完成执行时,您就知道您已经完成了。
这仍然会在磁盘上留下偶尔的 zip 文件(例如,如果您的服务器崩溃、重新启动或以其他方式中断),因此您将需要一个 cron 作业或类似的工作来定期运行以删除旧文件。
如果您可以一致地重新生成 zip 文件,则可以使用 http.ServeContent 动态生成 zip 文件(例如,这将要求您的基础数据保持不变或版本化)。您可以通过Seek
在 zip 之上编写自己的代码来完成此操作,该zip 始终会重置 zip 流并向前跳过 n 个字节。如果有很多搜索,这将是非常低效的,但是您可以拒绝接受范围,然后就会有两个搜索:一个到文件末尾,另一个回到开头(完成以计算长度) .
另一种避免磁盘文件的简单方法是在内存中生成 zip 文件,然后使用 strings.Reader 通过 http.ServeContent 为其提供服务。但是,使用此解决方案管理服务器中的内存使用会很困难。
- 3 回答
- 0 关注
- 533 浏览
添加回答
举报