Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gunakan berbilang bahagian Jenis Kandungan/data bentuk untuk menerbitkan data

Gunakan berbilang bahagian Jenis Kandungan/data bentuk untuk menerbitkan data

PHPz
PHPzke hadapan
2024-02-14 16:00:101177semak imbas

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

editor php Strawberry mengajar anda cara menggunakan berbilang bahagian/form-data Jenis Kandungan untuk menerbitkan data. Dalam pembangunan web, kita selalunya perlu memuat naik fail atau menyerahkan data borang. Fungsi ini boleh dicapai menggunakan berbilang bahagian/form-data Jenis Kandungan, yang merupakan format penghantaran data yang biasa digunakan. Dengan menggunakan format ini, kami boleh memuat naik dan menyerahkan fail serta data borang bersama-sama dengan mudah. Artikel ini akan memperkenalkan secara terperinci cara menggunakan berbilang bahagian/form-data Jenis Kandungan untuk menerbitkan data, serta langkah berjaga-jaga untuk penggunaannya. Mari belajar bersama!

Kandungan soalan

Saya cuba memuat naik imej dari komputer saya ke tapak web menggunakan go. Biasanya saya menggunakan skrip bash untuk menghantar fail dan kunci ke pelayan:

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

Ia berfungsi dengan baik tetapi saya cuba menukar permintaan ini kepada program golang saya.

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

Saya mencuba pautan ini dan banyak lagi, namun, untuk setiap kod yang saya cuba, respons daripada pelayan adalah "Tiada imej dihantar" dan saya tidak tahu mengapa. Jika sesiapa tahu apa yang berlaku dalam contoh di atas.

Penyelesaian

Berikut ialah beberapa contoh kod.

Ringkasnya, anda perlu menggunakan pakej mime/multipart untuk membina meja.

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
}

Atas ialah kandungan terperinci Gunakan berbilang bahagian Jenis Kandungan/data bentuk untuk menerbitkan data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam