2017-07-25 59 views
0

只是想知道你們是否可以幫助一些代碼。使用golang提供pdfs

它可以提供圖像,但不是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) 
    } 
} 

enter image description here

+1

「不起作用」不是問題描述。你能指望什麼?你看到了什麼呢? – Flimzy

+0

我的不好,我可以發誓我在這裏上傳了「it does work」狀態的圖片。是的.....它真的不起作用 –

+0

不工作是非常廣泛的,但如果你閱讀說明,它是提供圖像<<<<<很好,但pdf <<<<<不是很多。對諷刺道歉,但你會認爲人們會讀這個問題;儘管是一個令人難以置信的短的一個;在跑他們的嘴之前。非常感謝 –

回答

6

的代碼是有點低效率的,但它似乎是工作。但是,某些PDF查看器可能對您添加到HTTP響應流末尾的無關輸出很敏感。刪除w.Write([]byte("PDF Generated")),因爲這會損壞輸出。如果您想要進行調試,則可以將其更改爲fmt.Println

效率低下是因爲您將整個PDF文件加載到內存中,然後發送到客戶端。對於大文件,這會浪費內存。您最好使用io.Copy將文件和流直接從文件(io.Reader)打開到響應(io.Writer)。例如:

// 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錯誤響應非常重要,因此它意識到請求失敗。

+0

英鎊!工作過一種享受!謝謝。 –