golang multipart/form-data POST上传文件
2015-12-15 00:46
507 查看
package main import ( "bytes" "errors" "fmt" "io/ioutil" "mime/multipart" "net/http" ) func main() { createMemoToAmazon() } func createMemoToAmazon() error { buf := new(bytes.Buffer) w := multipart.NewWriter(buf) err := w.WriteField("comment", "我的世界!!!") if err != nil { fmt.Println(err) return err } resp, err := http.Get("http://www.xxx.com/1d595495-0580-49ec-b96c-cc3346096718") if err != nil { fmt.Println(err) return err } defer resp.Body.Close() if resp.StatusCode != 200 { return errors.New("resp status:" + fmt.Sprint(resp.StatusCode)) } bin, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(err) return err } fw, err := w.CreateFormFile("file", "1d595495-0580-49ec-b96c-cc3346096718") if err != nil { fmt.Println(err) return err } _, err = fw.Write(bin) if err != nil { fmt.Println(err) return err } w.Close() req, err := http.NewRequest("POST", "http://localhost:8080/info", buf) if err != nil { fmt.Println("req err: ", err) return err } req.Header.Set("Content-Type", w.FormDataContentType()) resp, err = http.DefaultClient.Do(req) if err != nil { fmt.Println("resp err: ", err) return err } defer resp.Body.Close() if resp.StatusCode != 200 { return errors.New("resp status:" + fmt.Sprint(resp.StatusCode)) } return nil }
如果要指定上传的每个部分的Content-Type,则需要重写multipart.Writer的CreateFormField和CreateFormFile方法
func CreateFormFile(fieldname, filename, contentType string, w *multipart.Writer) (io.Writer, error) { h := make(textproto.MIMEHeader) h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="%s"; filename="%s"`, escapeQuotes(fieldname), escapeQuotes(filename))) h.Set("Content-Type", contentType) return w.CreatePart(h) }
相关文章推荐
- Go 语言 Channel 实现原理精要
- Go语言将支持Android
- Golang实现的聊天程序服务端和客户端代码分享
- Golang学习笔记(三):控制流
- Golang学习笔记(二):类型、变量、常量
- Golang中的sync.WaitGroup用法实例
- Go语言struct类型介绍
- golang使用正则表达式解析网页
- Golang极简入门教程(三):并发支持
- Golang极简入门教程(四):编写第一个项目
- Golang记录、计算函数执行耗时、运行时间的一个简单方法
- 深入解析Go语言中for循环的写法
- Golang学习笔记(四):array、slice、map
- 理解Golang中的数组(array)、切片(slice)和map
- golang语言中for循环语句用法实例
- Golang学习笔记(一):简介
- golang操作mongodb的方法
- GO语言(golang)基础知识
- ubuntu下搭建Go语言(golang)环境
- Golang 内存模型详解(一)