Go 将的上载到internet站点

Go 将的上载到internet站点,go,Go,通过下面的代码,我可以从互联网上下载一个文件,并监控下载百分比 如何将文件上传到internet以及监控上传进度。我想在github资产上传可执行文件 主程序包 进口( “fmt” “io” “net/http” “操作系统” “字符串” “github.com/dustin/go人性化” ) //WriteCounter统计写入它的字节数。它实现了io.Writer接口 //我们可以将其传递到io.TeeReader(),它将报告每个写入周期的进度。 类型WriteCounter结构{ 总计u

通过下面的代码,我可以从互联网上下载一个文件,并监控下载百分比

如何将文件上传到internet以及监控上传进度。我想在github资产上传可执行文件

主程序包
进口(
“fmt”
“io”
“net/http”
“操作系统”
“字符串”
“github.com/dustin/go人性化”
)
//WriteCounter统计写入它的字节数。它实现了io.Writer接口
//我们可以将其传递到io.TeeReader(),它将报告每个写入周期的进度。
类型WriteCounter结构{
总计uint64
}
func(wc*WriteCounter)写入(p[]字节)(int,错误){
n:=len(p)
wc.总计+=uint64(n)
wc.PrintProgress()
返回n,无
}
func(wc WriteCounter)PrintProgress(){
//通过使用返回字符返回到起始位置并删除来清除该行
//用空格填充剩余字符
fmt.Printf(“\r%s”,字符串。重复(“,35))
//再次返回并打印下载的当前状态
//我们使用人性化软件包以有意义的方式打印字节(例如10 MB)
fmt.Printf(“\r下载…%s完成”,人性化.Bytes(wc.Total))
}
func main(){
fmt.Println(“已开始下载”)
文件URL:=”https://upload.wikimedia.org/wikipedia/commons/d/d6/Wp-w4-big.jpg"
错误:=下载文件(“avatar.jpg”,fileUrl)
如果错误!=零{
恐慌(错误)
}
fmt.Println(“下载完成”)
}
//DownloadFile将url下载到本地文件。它的效率很高,因为它会
//在下载时写入,而不是将整个文件加载到内存中。我们经过一个io阅读器
//输入Copy()以报告下载进度。
func下载文件(文件路径字符串、url字符串)错误{
//创建文件,但给它一个tmp文件扩展名,这意味着我们不会覆盖
//文件,直到它被下载,但我们将删除tmp扩展一旦下载。
out,err:=os.Create(filepath+“.tmp”)
如果错误!=零{
返回错误
}
//获取数据
resp,err:=http.Get(url)
如果错误!=零{
结束
返回错误
}
延迟响应主体关闭()
//创建我们的progress reporter并将其传递给我们的编剧
计数器:=&WriteCounter{}
如果2;,err=io.Copy(out,io.teereder(resp.Body,counter));err!=nil{
结束
返回错误
}
//进度使用同一行,因此下载完成后打印新行
格式打印(“\n”)
//在不延迟的情况下关闭文件,以便在重命名()之前执行此操作
结束
如果err=os.Rename(filepath+“.tmp”,filepath);err!=nil{
返回错误
}
归零
}

我只是修改了你的代码。它适用于我的文件服务器

func UploadFile(filepath string, url string) error {

    // Create the file, but give it a tmp file extension, this means we won't overwrite a
    // file until it's downloaded, but we'll remove the tmp extension once downloaded.
    out, err := os.Open(filepath)
    if err != nil {
        return err
    }

    // Create our progress reporter and pass it to be used alongside our writer
    counter := &WriteCounter{}

    // Get the data
    resp, err := http.Post(url, "multipart/form-data", io.TeeReader(out, counter))
    if err != nil {
        out.Close()
        log.Println(err.Error())
        return err
    }
    defer resp.Body.Close()

    // The progress use the same line so print a new line once it's finished downloading
    fmt.Print("\n")

    // Close the file without defer so it can happen before Rename()
    out.Close()

    return nil
}


为什么同样的策略不适用于上传?