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) }
Saya kumpulkan jawapan yang boleh membantu anda menyelesaikan masalah anda. Semua kod kepunyaan main.go
文件,只是为了演示。它有两个主要部分:handler
和 main
fungsi. Mari kita mulakan dengan pengendali.
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 http
、io
和fmt
). Kami hanya perlu menulis muatan masuk yang dibaca daripada permintaan http kepada aliran respons.
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, main
fungsi mempunyai lebih logik untuk ditangani. Mari semak mereka dalam senarai:
handlefile
处理程序来回复针对 /example
yang kami buat sebelum ini. 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. file.txt
)。我们将 content-type
标头设置为 application/octet-stream
并将文件句柄传递给 newrequest
. wg.wait
untuk memberitahu kumpulan menunggu untuk menunggu semua goroutine. 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!