go - 如何从多部分格式中提取文件
问题描述
我正在编写一个 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 结构。
解决方案
使用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 来处理错误。调整错误处理以满足您的应用程序的需要。
推荐阅读
- json - 海牛 Json 中的 JsonConverter
- tkinter - AttributeError:“str”对象在树视图项中没有属性“x”
- powershell - INI文件编辑,保存格式
- reactjs - 为什么这段代码会给出关于函数作为 React 子级无效的警告?
- javascript - React Redux 无法解析自己的模块
- r - 如何在 forloop 中使用扩展函数和左连接数据帧(DF1、DF2、DF3,直到 DF 621)?
- java - 我在 BlueJ 中无法弄清楚的编译错误
- django - 在创建数据库模式方面需要帮助
- django - 如何在 CloudFoundry 上的 HTTPS 上运行 Gunicorn
- python - Python - Return 语句清空我的列表