Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verwende ich „multipart/form-data“ für Datei-Uploads in Go?

Wie verwende ich „multipart/form-data“ für Datei-Uploads in Go?

Linda Hamilton
Linda HamiltonOriginal
2024-10-28 04:15:02259Durchsuche

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

Hochladen mit Multipart-/Formulardaten mit Go

Bei der Arbeit mit RESTful-APIs kann es vorkommen, dass Sie Daten mit dem Inhalt veröffentlichen müssen -Typ: Multipart/Formulardaten. Dies wird häufig für Datei-Uploads verwendet, bei denen Sie eine Kombination aus Text und Dateiparametern haben. In Go kann dies mit dem Paket mime/multipart erfolgen. Hier ist eine Lösung für das Problem, mit dem Sie konfrontiert waren:

Das Problem in Ihrem Code bestand darin, dass Sie nicht den richtigen Content-Type-Header für mehrteilige/Formulardatenanforderungen festgelegt haben. Anstelle von application/json sollten Sie multipart/form-data;charset=UTF-8 verwenden.

Hier ist eine verbesserte Version Ihres Codes, die multipart/form-data zum Posten verwendet:

<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>

In dieser Lösung erstellen wir einen mehrteiligen/Formulardaten-Anforderungstext mithilfe der Methoden „CreateFormFile“ und „WriteField“, die vom Paket „mime/multipart“ bereitgestellt werden. Anschließend setzen wir den Content-Type-Header entsprechend. Mit diesen Änderungen sollte Ihr Code in der Lage sein, Daten mit Content-Type: multipart/form-data erfolgreich zu POSTEN.

Das obige ist der detaillierte Inhalt vonWie verwende ich „multipart/form-data“ für Datei-Uploads in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn