I have an application that sends a zip file to a server. The zip is then manipulated and a new zip is send back in the response.
The problem is that the response sent back has a mime of application/octet-stream
instead of application/zip
message.
I think this is the reason why the resulting zip can't be opened by archive/zip
and I get a zip: not a valid zip file
.
Is there any way for me to change the mime when retrieving the zip file?
My code for getting the 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")
}
The Response.Write method writes the response in server response format to the argument. That's not what you want.
Use io.Copy to copy the response body to the file:
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")
}
Also, close the response body.