Go 如何从多部分表单中提取文件

Go 如何从多部分表单中提取文件,go,multipartform-data,Go,Multipartform Data,我正在编写一个Go客户端,通过REST-API创建备份。对GET请求使用多部分表单数据的REST-API响应。因此响应(type*http.response)主体的内容如下所示: --1ceb25134a5967272c26c9f3f543e7d26834a5967272c26c9f3f595caf08 Content-Disposition: form-data; name="configuration"; filename="test.gz" Cont

我正在编写一个Go客户端,通过REST-API创建备份。对GET请求使用多部分表单数据的REST-API响应。因此响应(type*http.response)主体的内容如下所示:

--1ceb25134a5967272c26c9f3f543e7d26834a5967272c26c9f3f595caf08
Content-Disposition: form-data; name="configuration"; filename="test.gz"
Content-Type: application/x-gzip

...

--1ceb25134a5967272c26c9f3f543e7d26834a5967272c26c9f3f595caf08--
如何从响应正文中提取zip文件

我尝试使用内置(net/http)方法,但这些方法需要一个请求结构。

使用包。假设
resp
*http.Response
,请使用以下代码迭代各部分

contentType := resp.Header.Get("Content-Type")
mediaType, params, err := mime.ParseMediaType(contentType)
if err != nil {
    log.Fatal(err)
}
if strings.HasPrefix(mediaType, "multipart/") {
    mr := multipart.NewReader(resp.Body, params["boundary"])
    for {
        p, err := mr.NextPart()
        if err == io.EOF {
            return
        }
        if err != nil {
            log.Fatal(err)
        }
        // p.FormName() is the name of the element.
        // p.FileName() is the name of the file (if it's a file)
        // p is an io.Reader on the part

        // The following code prints the part for demonstration purposes.
        slurp, err := ioutil.ReadAll(p)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("Part %q, %q: %q\n", p.FormName(), p.FileName(), slurp)
    }
}
答案中的代码通过调用log.Fata来处理错误。调整错误处理以满足应用程序的需要