由于服务器

时间:2017-12-01 00:52:10

标签: http go http-headers mime

我有一个将zip文件发送到服务器的应用程序。然后操纵zip并在响应中发回新的zip。

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

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

1 个答案:

答案 0 :(得分: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")
}

此外,关闭响应正文。