上传到互联网站点

使用下面的代码,我可以从互联网上下载一个文件,询问监控下载的百分比。


如何将文件上传到互联网以及监控上传进度。我想在 github assets 上传可执行文件


package main


import (

    "fmt"

    "io"

    "net/http"

    "os"

    "strings"


    "github.com/dustin/go-humanize"

)


// WriteCounter counts the number of bytes written to it. It implements to the io.Writer interface

// and we can pass this into io.TeeReader() which will report progress on each write cycle.

type WriteCounter struct {

    Total uint64

}


func (wc *WriteCounter) Write(p []byte) (int, error) {

    n := len(p)

    wc.Total += uint64(n)

    wc.PrintProgress()

    return n, nil

}


func (wc WriteCounter) PrintProgress() {

    // Clear the line by using a character return to go back to the start and remove

    // the remaining characters by filling it with spaces

    fmt.Printf("\r%s", strings.Repeat(" ", 35))


    // Return again and print current status of download

    // We use the humanize package to print the bytes in a meaningful way (e.g. 10 MB)

    fmt.Printf("\rDownloading... %s complete", humanize.Bytes(wc.Total))

}


func main() {

    fmt.Println("Download Started")


    fileUrl := "https://upload.wikimedia.org/wikipedia/commons/d/d6/Wp-w4-big.jpg"

    err := DownloadFile("avatar.jpg", fileUrl)

    if err != nil {

        panic(err)

    }


    fmt.Println("Download Finished")

}


// DownloadFile will download a url to a local file. It's efficient because it will

// write as it downloads and not load the whole file into memory. We pass an io.TeeReader

// into Copy() to report progress on the download.

func DownloadFile(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.Create(filepath + ".tmp")

    if err != nil {

        return err

    }


    // Get the data

    resp, err := http.Get(url)

    if err != nil {

        out.Close()

        return err

    }


SMILET
浏览 112回答 1
1回答

慕的地10843

我只是修改你的代码。它适用于我的文件服务器。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}我只是修改你的代码。它适用于我的文件服务器。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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go