Siarkan data binari (aplikasi/strim oktet)

WBOY
Lepaskan: 2024-02-05 21:15:28
ke hadapan
764 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 kepunyaanmain.go文件,只是为了演示。它有两个主要部分:handlermainfungsi. 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: pakejhttpiofmt). 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 akhirhandlefile处理程序来回复针对/exampleyang kami buat sebelum ini.
  2. Kami menggunakansync.waitgroupuntuk 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 fungsifile.txt)。我们将content-type标头设置为application/octet-stream并将文件句柄传递给newrequest.
  4. Kami membuat permintaan dan mencetak kandungan muatan respons http.
  5. Kami menutup pelayan dan menggunakan kaedahwg.waituntuk 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
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!