php小編草莓教你使用 Content-Type multipart/form-data 發佈資料。在網頁開發中,我們常常需要上傳文件或提交表單資料。而使用 Content-Type multipart/form-data 可以實現這項功能,它是一種常用的資料傳輸格式。透過使用該格式,我們可以方便地將文件和表單資料一起上傳和提交。本文將詳細介紹如何使用 Content-Type multipart/form-data 發布數據,以及其使用的注意事項。讓我們一起來學習吧!
我正在嘗試使用 go 將圖像從我的電腦上傳到網站。通常,我使用 bash 腳本將文件和密鑰發送到伺服器:
curl -F "image"=@"IMAGEFILE" -F "key"="KEY" URL
它工作正常,但我正在嘗試將此請求轉換為我的 golang 程式。
http://matt.aimonetti.net/posts/2013/07/01/golang-multipart-file-upload-example/
我嘗試了這個鏈接和許多其他鏈接,但是,對於我嘗試的每個代碼,伺服器的回應都是“未發送圖像”,我不知道為什麼。如果有人知道上面的例子發生了什麼事。
這是一些範例程式碼。
簡而言之,您需要使用 mime/multipart
套件 來建立表格。
package main import ( "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("POST", 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 }
以上是使用 Content-Type multipart/form-data 發布數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!