editor php Strawberry mengajar anda cara menggunakan berbilang bahagian/form-data Jenis Kandungan untuk menerbitkan data. Dalam pembangunan web, kita selalunya perlu memuat naik fail atau menyerahkan data borang. Fungsi ini boleh dicapai menggunakan berbilang bahagian/form-data Jenis Kandungan, yang merupakan format penghantaran data yang biasa digunakan. Dengan menggunakan format ini, kami boleh memuat naik dan menyerahkan fail serta data borang bersama-sama dengan mudah. Artikel ini akan memperkenalkan secara terperinci cara menggunakan berbilang bahagian/form-data Jenis Kandungan untuk menerbitkan data, serta langkah berjaga-jaga untuk penggunaannya. Mari belajar bersama!
Saya cuba memuat naik imej dari komputer saya ke tapak web menggunakan go. Biasanya saya menggunakan skrip bash untuk menghantar fail dan kunci ke pelayan:
curl -F "image"=@"IMAGEFILE" -F "key"="KEY" URL
Ia berfungsi dengan baik tetapi saya cuba menukar permintaan ini kepada program golang saya.
http://matt.aimonetti.net/posts/2013/07/01/golang-multipart-file-upload-example/
Saya mencuba pautan ini dan banyak lagi, namun, untuk setiap kod yang saya cuba, respons daripada pelayan adalah "Tiada imej dihantar" dan saya tidak tahu mengapa. Jika sesiapa tahu apa yang berlaku dalam contoh di atas.
Berikut ialah beberapa contoh kod.
Ringkasnya, anda perlu menggunakan pakej mime/multipart
untuk membina meja.
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 }
Atas ialah kandungan terperinci Gunakan berbilang bahagian Jenis Kandungan/data bentuk untuk menerbitkan data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!