黑窗口下带进度条的http下载-创新互联
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)
}
}
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章名称:黑窗口下带进度条的http下载-创新互联
分享URL:http://www.jxjierui.cn/article/coodpe.html


咨询
建站咨询
