为了账号安全,请及时绑定邮箱和手机立即绑定

上传到互联网站点

上传到互联网站点

Go
SMILET 2022-06-27 15:11:21
使用下面的代码,我可以从互联网上下载一个文件,询问监控下载的百分比。如何将文件上传到互联网以及监控上传进度。我想在 github assets 上传可执行文件package mainimport (    "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    }
查看完整描述

1 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

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


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

}


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号