l'éditeur php Strawberry vous apprend à utiliser Content-Type multipart/form-data pour publier des données. Dans le développement Web, nous devons souvent télécharger des fichiers ou soumettre des données de formulaire. Cette fonction peut être réalisée en utilisant Content-Type multipart/form-data, qui est un format de transmission de données couramment utilisé. En utilisant ce format, nous pouvons facilement télécharger et soumettre des fichiers et des données de formulaire ensemble. Cet article présentera en détail comment utiliser Content-Type multipart/form-data pour publier des données, ainsi que les précautions à prendre pour son utilisation. Apprenons ensemble !
J'essaie de télécharger une image de mon ordinateur vers un site Web à l'aide de Go. Normalement, j'utilise un script bash pour envoyer des fichiers et des clés au serveur :
curl -F "image"=@"IMAGEFILE" -F "key"="KEY" URL
Cela fonctionne bien mais j'essaie de convertir cette requête en mon programme golang.
http://matt.aimonetti.net/posts/2013/07/01/golang-multipart-file-upload-example/
J'ai essayé ce lien et bien d'autres, cependant, pour chaque code que j'ai essayé, la réponse du serveur était "Aucune image envoyée" et je ne sais pas pourquoi. Si quelqu'un sait ce qui se passe dans l'exemple ci-dessus.
Voici un exemple de code.
En bref, vous devez utiliser le mime/multipart
package pour construire la table.
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 }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!