gin通过文件流提供流式下载文件,golang

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 的返回错误。

你可能感兴趣的:(golang,gin,golang,前端)