2017-12-01 12 views
0

私は、サーバーにzipファイルを送信するアプリケーションを持っています。その後、ジップが操作され、応答で新しいジップが返されます。サーバーからの不正なmimeのため、Zipを開くことができません

返される応答は、application/zipメッセージの代わりにapplication/octet-streamのMIMEを持つという問題があります。

これは、結果のジップをarchive/zipで開くことができず、zip: not a valid zip fileと表示される理由です。

私はzipファイルを取得するときにMIMEを変更する方法はありますか?

zipファイルを取得するための私のコード:

func GetZipFromServer(zipname string) { 

    //////////////////////////////////////////////////// 
    // Open local zip file 

    file, err := os.Open(zipname + ".zip") 
    log1.Check(err, "File open failed") 
    defer file.Close() 

    stat, err := file.Stat() 
    log1.Check(err, "Stat failed") 

    fmt.Println(stat.Size()) 

    //////////////////////////////////////////////////// 
    // Get new zip from server 

    url := "http://some_server123.com/rest/" 
    res, err := http.Post(url, "application/zip", file) 
    log1.Check(err, "Response failed") 

    //////////////////////////////////////////////////// 
    // Save new zip from server as file 

    f, err := os.Create(zipname + ".html.zip") 
    log1.Check(err, "Cannot create file") 

    err = res.Write(f) 
    log1.Check(err, "Cannot write file") 

    err = f.Close() 
    log1.Check(err, "Cannot close file") 
} 
+0

サーバー上で**処理**の間にヘッダーを設定する必要があります。 –

+0

私はサーバーにアクセスできない場合、これを行うためにとにかくありますか? – AppTest

+0

残念ながらそうではありません。 MIMEはサーバー側に設定する必要があります。 –

答えて

1

Response.Writeメソッドは、引数にサーバの応答形式で応答を書き込みます。それはあなたが望むものではありません。

使用io.Copyファイルへのレスポンスボディをコピーする:また、

func GetZipFromServer(zipname string) { 
    file, err := os.Open(zipname + ".zip") 
    log1.Check(err, "File open failed") 
    defer file.Close() 

    stat, err := file.Stat() 
    log1.Check(err, "Stat failed") 

    fmt.Println(stat.Size()) 

    url := "http://some_server123.com/rest/" 
    res, err := http.Post(url, "application/zip", file) 
    log1.Check(err, "Response failed") 

    defer resp.Body.Close() 

    f, err := os.Create(zipname + ".html.zip") 
    log1.Check(err, "Cannot create file") 

    _, err := io.Copy(f, resp.Body) 
    log1.Check(err, "Cannot write file") 

    err = f.Close() 
    log1.Check(err, "Cannot close file") 
} 

レスポンスボディを閉じます。

+0

ありがとう、それは素晴らしい作品です。サーバーレスポンス形式で記述するときの違いは何ですか?それは "ヘッダー、非標準的なキーの値は予測できない振る舞いを持つ"と書かれたドキュメントとは関係がありますか? – AppTest

+0

HTTP応答には、ステータス行、ヘッダー、空白行、および本文があります(おそらく何らかのエンコーディングで)。 zipファイルは本体です。あなたがHTTPプロトコルに似ていないなら、https://developer.mozilla.org/en-US/docs/Web/HTTP/Messagesページが参考になるかもしれません。 –

関連する問題