package main
import (
"flag"
"fmt"
"io"
"log"
"net/http"
"os"
"strconv"
"strings"
"time"
"github.com/cheggaaa/pb"
)
var (
url = flag.String("url", "", "The download file URL.")
)
func Usage() {
fmt.Printf("Usage of %s:\n -url=\"http://www.xxx.com/file.exe\": The download file URL.\n", os.Args[0])
os.Exit(1)
}
func main() {
flag.Parse()
if os.Args == nil || *url == "" {
Usage()
}
// 解析/后的文件名字
urlMap := strings.Split(*url, "/")
fileName := urlMap[len(urlMap)-1]
// 解析帶? = fileName 的文件名字
if strings.Contains(fileName, "=") {
splitName := strings.Split(fileName, "=")
fileName = splitName[len(splitName)-1]
}
resp, err := http.Get(*url)
if err != nil {
log.Fatal(err)
}
// 判斷get url的狀態碼, StatusOK = 200
if resp.StatusCode == http.StatusOK {
log.Printf("[INFO] 正在下載: [%s]", fileName)
fmt.Print("\n")
downFile, err := os.Create(fileName)
if err != nil {
log.Fatal(err)
}
// 不要忘記關閉打開的文件.
defer downFile.Close()
// 獲取下載文件的大小
i, _ := strconv.Atoi(resp.Header.Get("Content-Length"))
sourceSiz := int64(i)
source := resp.Body
// 創建一個進度條
bar := pb.New(int(sourceSiz)).SetUnits(pb.U_BYTES).SetRefreshRate(time.Millisecond * 10)
// 顯示下載速度
bar.ShowSpeed = true
// 顯示剩余時間
bar.ShowTimeLeft = true
// 顯示完成時間
bar.ShowFinalTime = true
bar.SetMaxWidth(80)
bar.Start()
writer := io.MultiWriter(downFile, bar)
io.Copy(writer, source)
bar.Finish()
fmt.Print("\n")
log.Printf("[INFO] [%s]下載成功.", fileName)
} else {
fmt.Print("\n")
log.Printf("[ERROR] [%s]下載失敗,%s.", fileName, resp.Status)
}
}免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。