3 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
我只是在添加代碼。
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貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
您需要defer os.Remove(zf)
在請(qǐng)求處理程序中的某個(gè)位置。用戶下載文件與任何其他請(qǐng)求沒有什么不同:當(dāng)請(qǐng)求處理程序完成執(zhí)行時(shí),您就知道您已經(jīng)完成了。
這仍然會(huì)在磁盤上留下偶爾的 zip 文件(例如,如果您的服務(wù)器崩潰、重新啟動(dòng)或以其他方式中斷),因此您將需要一個(gè) cron 作業(yè)或類似的工作來定期運(yùn)行以刪除舊文件。
如果您可以一致地重新生成 zip 文件,則可以使用 http.ServeContent 動(dòng)態(tài)生成 zip 文件(例如,這將要求您的基礎(chǔ)數(shù)據(jù)保持不變或版本化)。您可以通過Seek
在 zip 之上編寫自己的代碼來完成此操作,該zip 始終會(huì)重置 zip 流并向前跳過 n 個(gè)字節(jié)。如果有很多搜索,這將是非常低效的,但是您可以拒絕接受范圍,然后就會(huì)有兩個(gè)搜索:一個(gè)到文件末尾,另一個(gè)回到開頭(完成以計(jì)算長(zhǎng)度) .
另一種避免磁盤文件的簡(jiǎn)單方法是在內(nèi)存中生成 zip 文件,然后使用 strings.Reader 通過 http.ServeContent 為其提供服務(wù)。但是,使用此解決方案管理服務(wù)器中的內(nèi)存使用會(huì)很困難。
- 3 回答
- 0 關(guān)注
- 572 瀏覽
添加回答
舉報(bào)