2017-12-01 6 views
0

Ich habe eine Anwendung, die eine ZIP-Datei an einen Server sendet. Der Zip wird dann manipuliert und ein neuer Zip wird in der Antwort zurückgesendet.Zip kann nicht mit Go wegen falscher Mime vom Server geöffnet werden

Das Problem ist, dass die Antwort zurückgeschickt hat eine Pantomime von application/octet-stream anstelle von application/zip Nachricht.

Ich denke, das ist der Grund, warum der resultierende Zip kann nicht geöffnet werden archive/zip und ich bekomme eine zip: not a valid zip file.

Gibt es eine Möglichkeit für mich, den Mime beim Abrufen der Zip-Datei zu ändern?

Mein Code für die Zip bekommen:

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

Sie müssten den Header festlegen, während Sie ** .zip auf dem Server verarbeiten. –

+0

Gibt es das überhaupt, wenn ich keinen Zugriff auf den Server habe? – AppTest

+0

Leider nicht; Der Pantomime muss serverseitig eingestellt werden. –

Antwort

1

Die Response.Write Methode schreibt die Antwort in Server-Antwort-Format auf das Argument. Das ist nicht was du willst.

Verwenden io.Copy den Antworttext in die Datei kopieren:

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") 
} 

Auch schließen Sie den Antworttext.

+0

Danke, das funktioniert super. Was ist der Grund für den Unterschied beim Schreiben im Server-Antwortformat? Hat es etwas mit den Schreibdokumenten zu tun, die sagen "Header, Werte für nicht-kanonische Schlüssel werden unvorhersehbares Verhalten haben"? – AppTest

+0

Eine HTTP-Antwort hat eine Statuszeile, Header, Leerzeile und den Text (möglicherweise in einer Kodierung). Die Zip-Datei ist der Körper. Wenn Sie mit dem HTTP-Protokoll nicht vertraut sind, kann die Seite https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages hilfreich sein. –

Verwandte Themen