只是想知道你们是否可以帮助编写一些代码。
它可以提供图片,但不能提供 pdf 手册。 提前致谢
func main(){
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
filename := "/var/www/filedipenser/brochure.pdf"
streamPDFbytes, err := ioutil.ReadFile( filename )
if err != nil {
fmt.Println(err)
os.Exit(1)
}
b := bytes.NewBuffer(streamPDFbytes)
w.Header().Set("Content-type", "application/pdf")
if _, err := b.WriteTo(w); err != nil {
fmt.Fprintf(w, "%s", err)
}
w.Write([]byte("PDF Generated"))
})
err := http.ListenAndServe(":4111", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
fmt.Println(err)
}
}
最佳答案
该代码效率有点低,但它似乎可以正常工作。但是,某些 PDF 查看器可能对您添加到 HTTP 响应流末尾的无关输出很敏感。删除 w.Write([]byte("PDF Generated"))
因为这会破坏输出。如果您出于调试目的,可以将其更改为 fmt.Println
。
效率低下是因为您将整个 PDF 文件加载到内存中,然后再发送给客户端。对于大文件,这会浪费内存。您最好打开文件并使用 io.Reader 直接从文件(io.Writer)流式传输到响应(io.Copy) .像这样的东西:
// Open file
f, err := os.Open(filename)
if err != nil {
fmt.Println(err)
w.WriteHeader(500)
return
}
defer f.Close()
//Set header
w.Header().Set("Content-type", "application/pdf")
//Stream to response
if _, err := io.Copy(w, f); err != nil {
fmt.Println(err)
w.WriteHeader(500)
}
您显然希望更好地处理错误,这只是一个示例。但是,重要的是在您遇到错误时向客户端提供 HTTP 错误响应,以便它知道请求失败。
关于pdf - 使用 golang 提供 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45302083/