func DownloadFile2(c *gin.Context) {
f, _ := os.Open("assets/cef_minimal.tar.bz2")
defer f.Close()
p := make([]byte, 1024)
w := c.Writer
w.Header().Set("Content-Type", "application/octet-stream")
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", "cef_minimal.tar.bz2"))
var readErr error
var readCount int
for {
readCount, readErr = f.Read(p)
if readErr != nil {
break
}
if readCount > 0 {
if _, err := w.Write(p[:readCount]); err != nil {
break
}
}
}
response.JsonResponseSuccess(c, "ok")
}
这里需要注意的是,客户端可能取消了下载,此时服务端的 write 会报 broken pipe 错误,此时应该终止请求,否则服务端会一直write 下去,所以不能用 c.Data()来输出字节流,因为这样就没法判断 write 的返回错误。