Maison > développement back-end > Golang > le corps du texte

Utilisez Content-Type multipart/form-data pour publier des données

PHPz
Libérer: 2024-02-14 16:00:10
avant
1179 Les gens l'ont consulté

使用 Content-Type multipart/form-data 发布数据

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 !

Contenu de la question

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
Copier après la connexion

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.

Solution de contournement

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
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal