用golang写一个大文件分片下载的代码
这是一个简单的大文件分片下载的代码,使用golang实现:
package main
import (
"fmt"
"io"
"net/http"
"os"
"strconv"
"sync"
)
func main() {
url := "https://example.com/largefile.iso"
filename := "largefile.iso"
numChunks := 10
wg := &sync.WaitGroup{}
for i := 0; i < numChunks; i++ {
start := i * (filesize(url) / numChunks)
end := (i + 1) * (filesize(url) / numChunks)
if i == numChunks-1 {
end = filesize(url)
}
wg.Add(1)
go downloadChunk(url, start, end, filename, wg)
}
wg.Wait()
fmt.Println("Downloaded", filename)
}
func filesize(url string) int64 {
resp, err := http.Head(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
size, err := strconv.Atoi(resp.Header.Get("Content-Length"))
if err != nil {
panic(err)
}
return int64(size)
}
func downloadChunk(url string, start int, end int, filename string, wg *sync.WaitGroup) {
defer wg.Done()
req, err := http.NewRequest("GET", url, nil)
if err != nil {
panic(err)
}
req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", start, end))
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
file, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
panic(err)
}
defer file.Close()
_, err = file.Seek(int64(start), 0)
if err != nil {
panic(err)
}
_, err = io.Copy(file, resp.Body)
if err != nil {
panic(err)
}
fmt.Printf("Downloaded bytes %d-%d\n", start, end)
}
这个代码将文件分成了10个块,每个块使用HTTP Range头请求。然后,每个块都被写入到同一个文件中。最后,在所有块都下载完成后,程序将输出“Downloaded filename”来表示下载完成
原文地址: https://www.cveoy.top/t/topic/fhzV 著作权归作者所有。请勿转载和采集!