|
我试着用 go 将图像从我的电脑上传到网站。通常,我用 bash 脚本向服务器发送文件和密钥:# F8 w- Y% [) ~# J: ~7 b. L" ]
curl -F "image"=@"IMAGEFILE" -F "key"="KEY" URL
9 L6 }& k# y0 r/ \6 V( p 它工作正常,但我试图把这个请求转换成我的 golang 程序。
( X# F2 @6 Z7 V8 q6 J* Fhttp://matt.aimonetti.net/posts/2013/07/01/golang-multipart-file-upload-example/0 T1 o6 U J( ?9 M
我尝试了这个链接和许多其他链接,但服务器对我尝试的每个代码的响应是没有图像,我不知道为什么。如果有人知道上面的例子发生了什么。& E3 K( v( q7 v; ^- I7 N
& E) F1 W) u2 [& k
解决方案: 4 B% l: z6 x; d0 R# {
这是一些示例代码。) x& L8 f2 v2 ?/ T$ h9 C+ D4 L
简而言之,你需要使用它mime/multipart包来构建表单。
. r: n1 k/ k/ B2 W/ `! S Xpackage mainimport "bytes" "fmt" "io" "mime/multipart" "net/http" "net/http/httptest" "net/http/httputil" "os" "strings")func main() var client *http.Client var remoteURL string setup a mocked http client. ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter,r *http.Request) b,err := httputil.DumpRequest(r,true) if err != nil panic(err) fmt.Printf("%s",b) )defer ts.Close() client = ts.Client() remoteURL = ts.URL } //prepare the reader instances to encode values := map[string]io.Reader{ "file": mustOpen("main.go"),// lets assume its this file "other": strings.NewReader("hello world!"), err := Upload(client,remoteURL,values) if err != nil panic(err) func Upload(client *http.Client,url string,values map[string]io.Reader) (err error) / Prepare a form that you will submit to that URL. var b bytes.Buffer w := multipart.NewWriter(&b) for key,r := range values var fw io.Writer if x,ok := r.(io.Closer); ok defer x.Close() Add an image file if x,ok := r.(*os.File); ok if fw,err = w.CreateFormFile(key,x.Name()); err != nil return else // Add other fields if fw,err = w.CreateFormField(key); err != nil return if _,err = io.Copy(fw,r); err != nil return err Don't forget to close the multipart writer. // If you don't close it,your request will be missing the terminating boundary. w.Close() // Now that you have a form,you can submit it to your handler. req,err := http.NewRequest(" OST",url,&b) if err != nil return } // Don't forget to set the content type,this will contain the boundary. req.Header.Set("Content-Type",w.FormDataContentType()Submit the request res,err := client.Do(req) if err != nil return Check the response if res.StatusCode != http.StatusOK err = fmt.Errorf("bad status: %s",res.Status) } return}func mustOpen(f string) *os.File r,err := os.Open(f) if err != nil panic(err) } return r}
) R4 N0 {4 Z& U4 H |
|