Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Siarkan data binari (aplikasi/strim oktet)

Siarkan data binari (aplikasi/strim oktet)

WBOY
WBOYke hadapan
2024-02-05 21:15:28792semak imbas

Siarkan data binari (aplikasi/strim oktet)

Kandungan soalan

Saya ingin memuat naik fail dengan jenis kandungan yang ditetapkan kepada strim aplikasi/oktet dan data binari fail dalam badan permintaan. Bagaimanakah saya melakukan ini dalam golang, berikut adalah kod permulaan saya:

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/http/httputil"
    "os"
)

func main() {
    file, err := os.Open("file.pdf")
    if err != nil {
        log.Fatalln(err)
    }

    req, err := http.NewRequest("POST", fmt.Sprintf("https://example.com/upload"), nil)
    req.Header.Add("Content-Type", "application/octet-stream")

    if err != nil {
        log.Fatalln(err)
    }

    client := &http.Client{
        Transport: &http.Transport{
            DisableCompression: true,
        },
    }

    resp, err := client.Do(req)
    if err != nil {
        log.Fatalln(err)
    }
    defer resp.Body.Close()

    reqDump, err := httputil.DumpRequest(req, true)
    if err != nil {
        log.Fatalln(err)
    }

    fmt.Println(reqDump)
}

Jawapan betul


Saya kumpulkan jawapan yang boleh membantu anda menyelesaikan masalah anda. Semua kod kepunyaan main.go 文件,只是为了演示。它有两个主要部分:handlermain fungsi. Mari kita mulakan dengan pengendali.

Pengendali http

func handlefile(w http.responsewriter, r *http.request) {
    if r.method != http.methodpost {
        w.writeheader(http.statusmethodnotallowed)
        return
    }
    fmt.println("handlefile")
    data, err := io.readall(r.body)
    if err != nil {
        panic(err)
    }
    defer r.body.close()
    w.write(data)
}

Di sini saya hanya bergantung pada apa yang anda gunakan (pergi perpustakaan standard sahaja: pakej httpiofmt). Kami hanya perlu menulis muatan masuk yang dibaca daripada permintaan http kepada aliran respons.

Fungsi utama

func main() {
    r := http.NewServeMux()
    r.HandleFunc("/example", HandleFile)
    srv := http.Server{
        Addr:    ":8000",
        Handler: r,
    }

    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        if err := srv.ListenAndServe(); err != nil {
            fmt.Println(err.Error())
        }
    }()

    file, err := os.Open("file.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    req, err := http.NewRequest(http.MethodPost, "http://localhost:8000/example", file)
    if err != nil {
        panic(err)
    }
    req.Header.Set("Content-Type", "application/octet-stream")
    client := &http.Client{
        Transport: &http.Transport{
            DisableCompression: true,
        },
    }
    res, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()
    data, err := io.ReadAll(res.Body)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(data))

    srv.Shutdown(context.Background())
    wg.Wait()
}

Sebaliknya, mainfungsi mempunyai lebih logik untuk ditangani. Mari semak mereka dalam senarai:

  1. Ia mencipta pelayan http untuk melayani permintaan masuk. Kami memperalatkannya untuk permintaan menggunakan titik akhir handlefile 处理程序来回复针对 /example yang kami buat sebelum ini.
  2. Kami menggunakan sync.waitgroup untuk menjalankan pelayan dalam goroutine yang berasingan. Terima kasih kepada ini, pelayan berfungsi dan berjalan, tetapi kami boleh meneruskan program kami dan menghantar permintaan http di dalamnya.
  3. Kami menyediakan permintaan http dengan kandungan fail dibaca daripada sistem fail tempatan (dalam kes kami fungsi file.txt)。我们将 content-type 标头设置为 application/octet-stream 并将文件句柄传递给 newrequest.
  4. Kami membuat permintaan dan mencetak kandungan muatan respons http.
  5. Kami menutup pelayan dan menggunakan kaedah wg.wait untuk memberitahu kumpulan menunggu untuk menunggu semua goroutine.

Pertimbangan akhir

Kod yang ditulis di sini pasti boleh diperbaiki. Bagaimanapun, hanya untuk demonstrasi, saya lebih suka menyimpannya sedekat mungkin dengan fail asal untuk memberi anda pemahaman yang lebih baik tentang cara menerbitkan binari pada pelayan http dan cara menjalankan program yang sama kedua-dua klien dan pelayan. Jika ada yang kurang jelas, sila beritahu saya, terima kasih!

Atas ialah kandungan terperinci Siarkan data binari (aplikasi/strim oktet). 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