Heim  >  Artikel  >  Backend-Entwicklung  >  Verwenden Sie Content-Type multipart/form-data, um Daten zu veröffentlichen

Verwenden Sie Content-Type multipart/form-data, um Daten zu veröffentlichen

PHPz
PHPznach vorne
2024-02-14 16:00:101174Durchsuche

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

Der PHP-Editor Strawberry zeigt Ihnen, wie Sie Content-Type-Multipart-/Formulardaten zum Veröffentlichen von Daten verwenden. Bei der Webentwicklung müssen wir häufig Dateien hochladen oder Formulardaten übermitteln. Diese Funktion kann mithilfe von Content-Type-Multipart-/Formulardaten erreicht werden, einem häufig verwendeten Datenübertragungsformat. Durch die Verwendung dieses Formats können wir Dateien und Formulardaten problemlos gemeinsam hochladen und übermitteln. In diesem Artikel wird detailliert beschrieben, wie Content-Type-Multipart-/Formulardaten zum Veröffentlichen von Daten verwendet werden und welche Vorsichtsmaßnahmen für deren Verwendung zu beachten sind. Lasst uns gemeinsam lernen!

Frageninhalt

Ich versuche, mit go ein Bild von meinem Computer auf eine Website hochzuladen. Normalerweise verwende ich ein Bash-Skript, um die Datei und den Schlüssel an den Server zu senden:

curl -F "image"=@"IMAGEFILE" -F "key"="KEY" URL

Es funktioniert gut, aber ich versuche, diese Anfrage in mein Golang-Programm umzuwandeln.

http://matt.aimonetti.net/posts/2013/07/01/golang-multipart-file-upload-example/

Ich habe diesen Link und viele andere ausprobiert, aber bei jedem Code, den ich ausprobiert habe, war die Antwort vom Server „Kein Bild gesendet“ und ich weiß nicht warum. Wenn jemand weiß, was im obigen Beispiel los ist.

Problemumgehung

Hier ist ein Beispielcode.

Kurz gesagt, Sie müssen das mime/multipart Paket verwenden, um die Tabelle zu erstellen.

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
}

Das obige ist der detaillierte Inhalt vonVerwenden Sie Content-Type multipart/form-data, um Daten zu veröffentlichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen