Maison  >  Article  >  développement back-end  >  Comment utiliser « multipart/form-data » pour les téléchargements de fichiers dans Go ?

Comment utiliser « multipart/form-data » pour les téléchargements de fichiers dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-28 04:15:02259parcourir

How to Use `multipart/form-data` for File Uploads in Go?

Téléchargement avec multipart/form-data à l'aide de Go

Lorsque vous travaillez avec des API RESTful, vous pouvez rencontrer le besoin de publier des données avec le contenu -Type : multipart/form-data. Ceci est couramment utilisé pour les téléchargements de fichiers, où vous disposez d’une combinaison de paramètres de texte et de fichier. Dans Go, cela peut être fait en utilisant le package mime/multipart. Voici une solution au problème auquel vous avez été confronté :

Le problème dans votre code était que vous ne définissiez pas l'en-tête Content-Type correct pour les requêtes multipart/form-data. Au lieu d'utiliser application/json, vous devez utiliser multipart/form-data;charset=UTF-8.

Voici une version améliorée de votre code qui utilise multipart/form-data pour la publication :

<code class="go">import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/http/httputil"
    "net/url"
    "mime/multipart"
)

func NewPost2(url string) ([]byte, error) {
    // Create a multipart/form-data request body.
    bodyBuf := &bytes.Buffer{}
    bodyWriter := multipart.NewWriter(bodyBuf)

    // Add text parameters to the form data.
    m := make(map[string]interface{})
    m["fileName"] = "good"
    for k, v := range m {
        bodyWriter.WriteField(k, v.(string))
    }

    // Add a file parameter to the form data.
    fileBytes := []byte(Base64ToByte("/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDHooor+wD+Zz//2Q=="))
    name := "test.jpg"
    fileWriter, err := bodyWriter.CreateFormFile("image_content", name)
    if err != nil {
        return nil, err
    }
    _, err = fileWriter.Write(fileBytes)
    if err != nil {
        return nil, err
    }
    bodyWriter.Close()

    // Create a new HTTP request with the multipart/form-data body.
    httpReq, err := http.NewRequest("POST", url, bodyBuf)
    if err != nil {
        return nil, err
    }
    httpReq.Header.Set("Content-Type", bodyWriter.FormDataContentType())

    // Perform the HTTP POST request.
    client := &http.Client{}
    resp, err := client.Do(httpReq)
    if err != nil {
        return nil, err
    }

    // Handle the HTTP POST response.
    defer resp.Body.Close()
    if resp.StatusCode < 200 || resp.StatusCode >= 300 {
        body, _ := httputil.DumpResponse(resp, true)
        return nil, fmt.Errorf("[%d %s]%s", resp.StatusCode, resp.Status, string(body))
    }

    // Read the HTTP response body.
    respData, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, err
    }

    // Return the HTTP response body.
    return respData, nil
}</code>

Dans cette solution, nous créons un corps de requête multipart/form-data à l'aide des méthodes CreateFormFile et WriteField fournies par le package mime/multipart. Nous définissons ensuite l'en-tête Content-Type en conséquence. Avec ces modifications, votre code devrait pouvoir POST avec succès les données avec Content-Type : multipart/form-data.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn