【问题标题】:Zip can't be opened with Go because of incorrect mime from server由于服务器的 MIME 不正确,无法使用 Go 打开 Zip
【发布时间】:2018-05-15 01:34:57
【问题描述】:

我有一个将 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")
}

【问题讨论】:

  • 您需要在服务器上处理 .zip 时设置标头。
  • 如果我无权访问服务器,是否有办法这样做?
  • 很遗憾没有; mime 必须设置在服务器端。
  • 这个问题与Content-Type响应头的值无关。

标签: http go http-headers 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")
}

另外,关闭响应正文。

【讨论】:

  • 谢谢,效果很好。以服务器响应格式编写时出现差异的原因是什么?这与写文档说“标题,非规范键的值将具有不可预测的行为”有关吗?
  • 一个 HTTP 响应有一个状态行、标头、空白行和正文(可能在某些编码中)。 zip 文件是正文。如果您不熟悉 HTTP 协议,那么页面 developer.mozilla.org/en-US/docs/Web/HTTP/Messages 可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
相关资源
最近更新 更多