POST multipart/form-data
Lors de la tentative de POST de données à l'aide de multipart/form-data, des messages d'erreur comme celui fourni peuvent être rencontrés. Comprendre la question nécessite d’examiner la composition du problème. L'erreur rencontrée est une réponse 301 Moved Permanently, indiquant que la ressource a été redirigée définitivement. Cela se produit souvent lorsque l'en-tête Content-Type correct n'est pas défini pour les requêtes multipart/form-data.
Pour résoudre ce problème, assurez-vous que l'en-tête Content-Type est explicitement défini sur "multipart/form-data ; charset=UTF-8" lors de la requête POST. Cet en-tête informe le serveur que la requête inclut à la fois des données textuelles et binaires formatées selon le protocole multipart/form-data.
Vous trouverez ci-dessous un code Go corrigé qui définit avec succès l'en-tête Content-Type correct :
<code class="go">import ( "bytes" "fmt" "io" "io/ioutil" "mime/multipart" "net/http" ) func NewPostWithMultipartFormData(url string, paramTexts map[string]string, paramFiles []FileItem) ([]byte, error) { // Initialize a buffer to write the multipart form data. buf := new(bytes.Buffer) // Create a new multipart writer. w := multipart.NewWriter(buf) // Add text parameters to the multipart form. for key, value := range paramTexts { field, err := w.CreateFormField(key) if err != nil { return nil, fmt.Errorf("error creating form field '%s': %v", key, err) } if _, err := field.Write([]byte(value)); err != nil { return nil, fmt.Errorf("error writing value to form field '%s': %v", key, err) } } // Add binary parameters to the multipart form. for _, file := range paramFiles { fileWriter, err := w.CreateFormFile(file.Key, file.FileName) if err != nil { return nil, fmt.Errorf("error creating form file '%s': %v", file.Key, err) } if _, err := fileWriter.Write(file.Content); err != nil { return nil, fmt.Errorf("error writing content to form file '%s': %v", file.Key, err) } } // Close the multipart writer. if err := w.Close(); err != nil { return nil, fmt.Errorf("error closing multipart writer: %v", err) } contentType := w.FormDataContentType() // Create a new POST request with the correct Content-Type header. req, err := http.NewRequest(http.MethodPost, url, buf) if err != nil { return nil, fmt.Errorf("error creating HTTP request: %v", err) } req.Header.Set("Content-Type", contentType) // Perform the HTTP request. client := http.Client{} resp, err := client.Do(req) if err != nil { return nil, fmt.Errorf("error sending HTTP request: %v", err) } defer resp.Body.Close() // Read the response body. body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("error reading HTTP response body: %v", err) } return body, nil }</code>
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!