我使用Excelize库生成xlsx文档。当我使用它的Write(io.writer)
func将xlsx保存到文件时,它可以很好地工作。但我需要在Web服务器上生成并提供此文件。我正在尝试这个解决方案
func GetConsolidatedReport(w http.ResponseWriter, r *http.Request) {
var reportFile *excelize.File
...
var b bytes.Buffer
writr := bufio.NewWriter(&b)
reportFile.SaveAs("/tmp/testfile.xlsx")
reportFile.Write(writr)
writr.Flush()
fileContents := b.Bytes()
fileSize := strconv.Itoa(len(fileContents))
w.Header().Set("Content-Disposition", "attachment; filename=report.xlsx")
w.Header().Set("Content-Type", "application/octet-stream")
w.Header().Set("Content-Length", fileSize)
t := bytes.NewReader(b.Bytes())
io.Copy(w, t)
}
之后我从网络服务器上获得了损坏的zip文件,但正常的文件保存在" /tmp/testfile.xlsx"
我已尝试将内容类型设为application/zip
,application/octet-stream
,application/vnd.*
,但没有运气。
PS:通过服务我的意思是动态生成文件,对不起任何误解。
PS2:我似乎得到了下载文件的开销(8085字节的原始文件和13000+的下载文件),我无法弄清楚这个开销的来源。
答案 0 :(得分:1)
为了服务读者,您应该考虑http.ServeContent
。它将为您处理标题,内容范围等。
使用io.Copy
更改http.ServeContent(w,r,"testfile.xlsx",time.Now(),t)
行,它将起作用。
文件:https://golang.org/pkg/net/http/#ServeContent