Go语言使用http下载文件

参考

https://blog.csdn.net/a99361481/article/details/81751231

 

package main

import (
    "net/http"
    "log"
    "time"
    "net/url"
    "path"
    "os"
    "io"
    "bufio"
    "math"
    "strconv"
)

var durl = "https://dl.google.com/go/go1.10.3.darwin-amd64.pkg";

func main() {
    uri, err := url.ParseRequestURI(durl)
    if err != nil {
        panic("网址错误")
    }

    filename := path.Base(uri.Path)
    log.Println("[*] Filename " + filename)

    client := http.DefaultClient;
    client.Timeout = time.Second * 60 //设置超时时间
    resp, err := client.Get(durl)
    if err != nil {
        panic(err)
    }
    if resp.ContentLength <= 0 {
        log.Println("[*] Destination server does not support breakpoint download.")
    }
    raw := resp.Body
    defer raw.Close()
    reader := bufio.NewReaderSize(raw, 1024*32);


    file, err := os.Create(filename)
    if err != nil {
        panic(err)
    }
    
    defer file.Close()
    
    writer := bufio.NewWriter(file)

    buff := make([]byte, 32*1024)
    written := 0
    go func() {
        for {
            nr, er := reader.Read(buff)
            if nr > 0 {
                nw, ew := writer.Write(buff[0:nr])
                if nw > 0 {
                    written += nw
                }
                if ew != nil {
                    err = ew
                    break
                }
                if nr != nw {
                    err = io.ErrShortWrite
                    break
                }
            }
            if er != nil {
                if er != io.EOF {
                    err = er
                }
                break
            }
        }
        if err != nil {
            panic(err)
        }
    }()

    spaceTime := time.Second * 1
    ticker := time.NewTicker(spaceTime)
    lastWtn := 0
    stop := false

    for {
        select {
        case <-ticker.C:
            speed := written - lastWtn
            log.Printf("[*] Speed %s / %s \n", bytesToSize(speed), spaceTime.String())
            if written-lastWtn == 0 {
                ticker.Stop()
                stop = true
                break
            }
            lastWtn = written
        }
        if stop {
            break
        }
    }
}

func bytesToSize(length int) string {
    var k = 1024 // or 1024
    var sizes = []string{"Bytes", "KB", "MB", "GB", "TB"}
    if length == 0 {
        return "0 Bytes"
    }
    i := math.Floor(math.Log(float64(length)) / math.Log(float64(k)))
    r := float64(length) / math.Pow(float64(k), i)
    return strconv.FormatFloat(r, 'f', 3, 64) + " " + sizes[int(i)]
}

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gohttp是一个http文件服务器,因为是用go语言写的,所以加了一个go的抬头。之所以用go是因为发布起来是一个二进制文件,不同的平台都可以用,而且没有依赖问题,且稳定性也很好。    这个软件从很久以前就开始写了,第一次提交实在2015年的2月11号,作为组内存放公共文件的一个小软件。一开始的功能只有像 python -mSimpleHTTPServer 那种简单的功能。但是当我看到gotty这个软件的时候 ,意思到一个简单的软件竟然可以做到如此出色。之后这个http文件服务器就不断的被优化着,保持着简单易用的同时,开始赋予了它最强大的功能。    这个软件有很多的技术,隐藏在了其简易朴实的外表之下。请容我简单的介绍下pjax简称页面ajax技术        在gohttp进行目录却换的时候,你会看到地址栏在变,但是页面却是局部刷新的。各种文件的预览功能        所有常见的代码都可以直接在gohttp下预览,如果你用的是chrome浏览器的话,包括pdf,mp4,mp3都可以直接预览。实时的目录zip打包下载        强大的体现在它是实时的,即使你马上在目录下新增了一个文件,点击目录zip下载的时候,这个文件也会出现在里面。二维码的支持        手机下载往往没有电脑下载这么容易,点点鼠标就可以了。但是有了二维码,手机也只用扫一扫就可以下载了。苹果应用的在线安装        iphone应用安装包的扩展名是ipa,但是你还必须有个额外的plist文件才行。以及生成一个itms-services开头的地址,gohttp直接把这些工作都做了,ipa的解析,plist以及下载页面的自动生成。同普通文件一样,只需要点击右侧的生成二维码,然后用iphone手机扫描下,iphone的应用就安装到了你的手机上。PS:坑爹的苹果,就不能像安卓一样简单一点吗README文件的自动显示像github网站上的项目,readme文件都会作为项目的介绍自动显示出来。gohttp也借鉴了一下。如果目录下有readme文件的话,就会自动预览出来。文件上传简单的文件上传也有着出色的表现,可以看到上传的进度,以及支持拖拽的方式上传文件。为了更方便的结合自动发布的功能,文件上传也有其相应的API,上传的时候也可是指定软件的版本号,存储结构参考了python,pypi官方的模式。还有很多很多其他的特性    http basic auth认证,不同文件不同的icon,gzip支持,目录的整合显示.... 还有很多功能等待着你去发现和有能力的你去补充。    截图  标签:gohttp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值