如何从多部分形式中提取文件
How to extract files from multipart-form
我正在编写一个 Go 客户端以通过 REST-API 创建备份。 REST-API 对 GET 请求的多部分表单数据响应。所以响应(类型*http.Response)正文的内容如下所示:
--1ceb25134a5967272c26c9f3f543e7d26834a5967272c26c9f3f595caf08
Content-Disposition: form-data; name="configuration"; filename="test.gz"
Content-Type: application/x-gzip
...
--1ceb25134a5967272c26c9f3f543e7d26834a5967272c26c9f3f595caf08--
如何从响应正文中提取 zip 文件?
我尝试使用内置 (net/http) 方法,但这些方法需要请求结构。
使用 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 来处理错误。调整错误处理以满足您的应用程序的需要。
我正在编写一个 Go 客户端以通过 REST-API 创建备份。 REST-API 对 GET 请求的多部分表单数据响应。所以响应(类型*http.Response)正文的内容如下所示:
--1ceb25134a5967272c26c9f3f543e7d26834a5967272c26c9f3f595caf08
Content-Disposition: form-data; name="configuration"; filename="test.gz"
Content-Type: application/x-gzip
...
--1ceb25134a5967272c26c9f3f543e7d26834a5967272c26c9f3f595caf08--
如何从响应正文中提取 zip 文件?
我尝试使用内置 (net/http) 方法,但这些方法需要请求结构。
使用 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 来处理错误。调整错误处理以满足您的应用程序的需要。