登录
首页 >  Golang >  Go问答

发布到网络平台

来源:stackoverflow

时间:2024-02-28 17:27:17 187浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《发布到网络平台》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

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

我怎样才能将文件上传到互联网并监控上传进度。我想在github资产上传可执行文件

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
    }
    defer resp.Body.Close()

    // Create our progress reporter and pass it to be used alongside our writer
    counter := &WriteCounter{}
    if _, err = io.Copy(out, io.TeeReader(resp.Body, counter)); err != nil {
        out.Close()
        return err
    }

    // 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()

    if err = os.Rename(filepath+".tmp", filepath); err != nil {
        return err
    }
    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
}

好了,本文到此结束,带大家了解了《发布到网络平台》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>