Gunakan berbilang bahagian Jenis Kandungan/data bentuk untuk menerbitkan data

PHPz
Lepaskan: 2024-02-14 16:00:10
ke hadapan
1179 orang telah melayarinya

使用 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
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan