【问题标题】:How to extract files from multipart-form如何从多部分格式中提取文件
【发布时间】:2020-10-20 06:49:12
【问题描述】:

我正在编写一个 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 结构。

【问题讨论】:

    标签: go multipartform-data


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-05-26
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多