2016-10-04 14 views
2

私はすでにcontest-encodingの値を設定していますが、ファイルはまだ大きいので、どのようにテンプレートをgzipできますか?golang webでテンプレートをgzipする方法

func indexPageHandler(w http.ResponseWriter, r *http.Request) { 
    w.Header().Set("Content-Encoding", "gzip") 
    r.Header.Set("Accept-Encoding", "gzip") 
    tmpl, err := template.New("index.html").ParseGlob("./templates/*") 
    if err != nil { 
     log.Println(err) 
     return 
    } 
    err = tmpl.Execute(w, nil) 
    if err != nil { 
     http.Error(w, err.Error(), http.StatusInternalServerError) 
     return 
    } 
} 

レスポンスをgzipすることができます任意の関数があります]アドバイスが続く

、私はこのように私のコードを変更:?

func indexPageHandler(w http.ResponseWriter, r *http.Request) { 
    w.Header().Set("Content-Encoding", "gzip") 
    r.Header.Set("Accept-Encoding", "gzip") 
    gz := gzip.NewWriter(w) 
    defer gz.Close() 
    tmpl, err := template.New("index.html").ParseGlob("./templates/*") 
    if err != nil { 
     log.Println(err) 
     return 
    } 
    err = tmpl.Execute(gz, nil) 
    if err != nil { 
     http.Error(w, err.Error(), http.StatusInternalServerError) 
     return 
    } 
} 

しかし、私は、URLのクエリを実行したときに、私だけgzipファイルをダウンロードしてください。どうしたの?

+1

特に大きなものは、ハンドラ内のテンプレートを解析しないでください。詳細については、[テンプレート]パッケージを使用してgolangのクライアントに動的Webページを生成するには時間がかかる](http://stackoverflow.com/a/28453523/1705598) – icza

+0

@iczaこれはグローバル変数ではない。 .jsファイルと.cssファイルが大きすぎるため、ブラウザがWebコンテンツをダウンロードするのに時間がかかりすぎる。 – Wyatt

答えて

-1

とにかく、私はこの問題を解決していません。私が言及したように、このコードを追加すると、サーバを再起動してこのURLを問い合わせると、私は実際にzipファイルをダウンロードします!

最後にNginxを使用してリバースプロキシを作成してテンプレートを圧縮しました。できます。

それでも要求は効果がありません上のヘッダーを設定

2

あなたはパッケージcompress/gzip使用することができます。

(io.Writerワット)のFUNC NewWriter *新しいライターを返しNewWriterライター

を。
返されたライターへの書き込みは圧縮され、wに書き込まれます。

完了したらWriteCloser
でCloseを呼び出すのは、呼び出し元の責任です。書き込みはバッファリングされ、閉じるまでフラッシュされません。あなたのコードで

、それは次のようになります。

gz := gzip.NewWriter(w) 
defer gz.Close() 

err = tmpl.Execute(gz, nil) 
if err != nil { 
    http.Error(gz, err.Error(), http.StatusInternalServerError) 
    return 
} 

Psと。

リクエストでAccept-Encodingヘッダーをチェックして、ブラウザがgzipでエンコードされたコンテンツを受け入れるかどうかを確認できます。

+0

私はこのコードを試しましたが、私はこのurlを問い合わせます。私はこのzipファイルだけをdonwloadします。私のコードは上記のとおりです – Wyatt

1
r.Header.Set("Accept-Encoding", "gzip") 

を@Anisusに感謝します。 gzipを使用するかどうかを判断するには、このヘッダーを読んでください。

ブラウザがファイルをレンダリングする代わりにダウンロードするのは、コンテンツタイプが見つからないためです。 Content-Typeを設定せずにhttp.ResponseWriterに書き込むときは、Content-Typeを決定し、正しいヘッダーを設定するアルゴリズムがあります。しかし、あなたの体はgzipで、正しいコンテンツタイプを判断することはできません。これを追加して、クライアントにデータを書き戻す前に:

w.Header().Set("Content-Type", "text/html") 
関連する問題