Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan http.Transport in Go untuk melaksanakan pemindahan resume titik putus fail besar?

Bagaimana untuk menggunakan http.Transport in Go untuk melaksanakan pemindahan resume titik putus fail besar?

王林
王林asal
2023-07-22 19:40:501041semak imbas

Bagaimana untuk menggunakan http.Transport in Go untuk melaksanakan pemindahan resume titik putus fail besar?

Semasa penghantaran rangkaian, penghantaran fail besar selalunya mengambil masa yang lama Untuk meningkatkan kecekapan dan kestabilan penghantaran, teknologi sambungan titik putus telah menjadi penyelesaian biasa. Dalam bahasa Go, kita boleh menggunakan http.Transport untuk melaksanakan pemindahan resume titik putus fail besar, menjadikan penghantaran rangkaian lebih stabil dan boleh dipercayai. Artikel ini akan memperkenalkan cara menggunakan http.Transport untuk melaksanakan penyambungan semula titik putus dan memberikan contoh kod yang sepadan.

  1. Memulakan http.Transport

Pertama, kita perlu memulakan objek http.Transport, yang akan bertanggungjawab untuk penghantaran rangkaian. Kita boleh mengawal beberapa butiran penghantaran dengan mengkonfigurasi parameter objek http.Transport.

transport := &http.Transport{
    MaxIdleConnsPerHost:   10,
    DisableCompression:    true,
    DisableKeepAlives:     true,
    ResponseHeaderTimeout: time.Second * 5,
}

Dalam kod di atas, kami menetapkan bilangan maksimum sambungan melahu kepada 10, mampatan dilumpuhkan dan pilihan untuk mengekalkan sambungan dan menetapkan tamat masa pengepala respons kepada 5 saat. Parameter ini boleh dilaraskan mengikut keperluan sebenar.

  1. Mulakan permintaan HTTP

Seterusnya, kita boleh menggunakan objek http.Transport untuk memulakan permintaan HTTP. Sebelum memulakan permintaan, kami perlu membina objek http.Request dan nyatakan URL yang diminta, kaedah permintaan, pengepala permintaan dan maklumat lain.

req, err := http.NewRequest("GET", "http://example.com/large_file.zip", nil)
if err != nil {
    log.Fatal(err)
}
// 添加断点续传的相关请求头信息
if fileInfo, err := os.Stat("local_file.zip"); err == nil {
    req.Header.Set("Range", "bytes="+strconv.FormatInt(fileInfo.Size(), 10)+"-")
}

Dalam kod di atas, kami membuat permintaan GET menggunakan kaedah http.NewRequest dan menentukan URL fail besar untuk dimuat turun. Pada masa yang sama, kami melaksanakan penyambungan semula titik putus dengan menetapkan pengepala permintaan "Julat" mengikut saiz fail setempat yang dimuat turun.

  1. Melaksanakan permintaan HTTP

Selepas permintaan dibina, kami boleh melaksanakan permintaan HTTP melalui kaedah RoundTrip objek http.Transport dan mendapatkan hasil tindak balas.

resp, err := transport.RoundTrip(req)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

if resp.StatusCode != http.StatusPartialContent {
    // 如果服务器未返回部分内容,无法进行断点续传
    log.Fatal("Server does not support partial content")
}

// 检查是否支持断点续传
contentRange := resp.Header.Get("Content-Range")
if contentRange == "" {
    // 如果服务器未返回Content-Range头部,无法进行断点续传
    log.Fatal("Server does not support content range")
}

// 获取已下载的文件大小
currentSize, err := getCurrentFileSize(contentRange)
if err != nil {
    log.Fatal(err)
}

Dalam kod di atas, kami mula-mula menyemak sama ada pelayan telah memulangkan sebahagian daripada kandungan (kod status ialah 206 Jika pelayan tidak mengembalikan sebahagian daripada kandungan, ia tidak akan dapat menyambung semula muat naik). Kemudian, kami mengesahkan sama ada pelayan menyokong muat turun boleh disambung semula dengan menyemak medan "Julat-Kandungan" dalam pengepala respons. Jika pelayan tidak mengembalikan medan "Julat-Kandungan", muat naik tidak akan disambung semula.

  1. Memuat turun fail

Jika langkah sebelumnya berjaya dilalui, iaitu pelayan menyokong penyambungan titik putus, kita boleh mula memuat turun fail dan menyimpan fail secara setempat.

out, err := os.OpenFile("local_file.zip", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
    log.Fatal(err)
}
defer out.Close()

_, err = io.Copy(out, resp.Body)
if err != nil {
    log.Fatal(err)
}

// 下载完成后,检查文件完整性
fileSize, err := getFileSize(contentRange)
if err != nil {
    log.Fatal(err)
}

if currentSize != fileSize {
    log.Fatal("Downloaded file size does not match")
}

fmt.Println("Download completed")

Dalam kod di atas, kami mula-mula membuka fail setempat untuk menyimpan kandungan yang dimuat turun. Kemudian, kandungan respons ditulis ke fail tempatan melalui fungsi io.Copy. Akhir sekali, kami menyemak sama ada saiz fail yang dimuat turun sepadan dengan saiz fail yang dikembalikan oleh pelayan untuk memastikan integriti fail.

Pada ketika ini, kami telah menyelesaikan proses menggunakan http.Transport untuk melaksanakan pemindahan semula fail besar. Melalui langkah di atas, kami boleh meningkatkan kecekapan dan kestabilan penghantaran semasa penghantaran rangkaian dan memastikan penghantaran fail besar yang selamat.

Ringkasan

Artikel ini memperkenalkan cara menggunakan bahasa http.Transport in Go untuk melaksanakan pemindahan resume titik putus fail besar. Dengan mengkonfigurasi parameter objek http.Transport dengan betul, kami boleh mengawal butiran penghantaran, seperti bilangan maksimum sambungan melahu, fungsi mampatan, tamat masa permintaan, dsb. Pada masa yang sama, kami boleh melaksanakan penyambungan semula titik putus dengan menetapkan pengepala permintaan "Julat" mengikut saiz fail yang dimuat turun. Akhir sekali, kami menulis kandungan respons kepada fail tempatan melalui fungsi io.Copy dan semak integriti fail. Langkah-langkah ini boleh membantu kami meningkatkan kecekapan penghantaran dan kestabilan dalam pemindahan fail besar dan mencapai pengalaman pengguna yang lebih baik.

Kod rujukan: https://gist.github.com/anonymous/043cdf4cf58e183d08c5ad7d01c8db82

Atas ialah kandungan terperinci Bagaimana untuk menggunakan http.Transport in Go untuk melaksanakan pemindahan resume titik putus fail besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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