Siarkan data binari (aplikasi/strim oktet)

WBOY
Lepaskan: 2024-02-05 21:15:28
ke hadapan
831 orang telah melayarinya

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


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

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

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!

Label berkaitan:
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