http - 由于来自服务器的 mime 不正确,无法使用 Go 打开 Zip

标签 http go http-headers mime

我有一个向服务器发送 zip 文件的应用程序。然后对 zip 进行操作,并在响应中发回一个新的 zip。

问题是发回的响应有 application/octet-stream 而不是 application/zip 消息的 mime。

我认为这就是为什么 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")
}

此外,关闭响应主体。

关于http - 由于来自服务器的 mime 不正确,无法使用 Go 打开 Zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47585037/

相关文章:

javascript - 如何等待少数 HTTP promise 完成并仅在所有 promise 都失败时才显示模式

json - Golang 解析带有嵌入式 XML 的 JSON

Linux 上的 Golang : How to use syscall. 系统调用?

c# - 在 .net 4.5 中使用 ClientWebSocket 时如何设置 User-Agent 和 Referer header ?

java - 当浏览器等待时

http - 如何让 Wget 处理 HTTP 100-Continue 响应?

iOS Post请求,发送图片Base64编码

php - 如何将 HTTP header /正文与 PHP 套接字请求隔离开来

在 Go 中解析 YAML : map in list

javascript - 如何使用 js 或 jQuery 向 ajax 请求添加自定义 HTTP header ?