只是想知道你们是否可以提供一些代码帮助。
它可以提供图像,但不是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)
}
}
答案 0 :(得分:6)
代码效率有点但似乎有效。但是,某些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错误响应,这一点非常重要,因此它会发现请求失败。