golang

2017-07-25 2 views
0

を使用してpdfを利用する人は、いくつかのコードを手伝ってもらえますか?golang

イメージの配信には使用できますが、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

私は悪い、私はここに "それは仕事をしている"状態の画像をアップロード誓うことができた。そしてはい.....それは実際に仕事をしません –

+0

doesntの仕事は非常に広いですが、あなたが説明を読むなら、それは画像<<<<<をかなり役立っていますが、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

スターリング!治療をしました!ありがとうございました。 –