首页 > 解决方案 > 如何从多部分格式中提取文件

问题描述

我正在编写一个 Go 客户端以通过 REST-API 创建备份。带有多部分表单数据的 REST-API 响应到 GET-Request。所以响应(类型 *http.Response)正文的内容如下所示:

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

...

--1ceb25134a5967272c26c9f3f543e7d26834a5967272c26c9f3f595caf08--

如何从响应正文中提取 zip 文件?

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

标签: gomultipartform-data

解决方案


使用mime/multipart包。假设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 来处理错误。调整错误处理以满足您的应用程序的需要。


推荐阅读