由于来自服务器的 mime 不正确,无法使用 Go 打开 Zip
Zip can't be opened with Go because of incorrect mime from server
我有一个向服务器发送 zip 文件的应用程序。然后对 zip 进行操作,并在响应中发回一个新的 zip。
问题是发回的响应有 application/octet-stream
的 MIME 而不是 application/zip
消息。
我认为这就是为什么 archive/zip
无法打开生成的 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")
}
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")
}
另外,关闭响应正文。
我有一个向服务器发送 zip 文件的应用程序。然后对 zip 进行操作,并在响应中发回一个新的 zip。
问题是发回的响应有 application/octet-stream
的 MIME 而不是 application/zip
消息。
我认为这就是为什么 archive/zip
无法打开生成的 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")
}
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")
}
另外,关闭响应正文。