2017-01-24 9 views
0

APIにPOSTリクエストを送信していて、サードパーティのライブラリ(https://github.com/cheggaaa/pb)を使用していますが、実際にファイル転送が完了する前にアップロードプログレスバーが終了しています。アップロードが完了する前にアップロードの進行状況バーが終了するのはなぜですか?

package main 

import(
    pb "gopkg.in/cheggaaa/pb.v1" 
    "net/http" 
) 

func main() { 
    file, e := os.Open(path) 
    if e != nil { 
     log.Fatal() 
    } 
    defer file.Close() 

    bar := pb.New(int(fi.Size())) 
    bar.Start() 


    req, err := http.NewRequest("POST", url, body) 

    resp, err := client.Do(req) 

    bar.Finish() 

    return 
} 

それは

12.64 MB/12.64 MB [======================] 100.00% 12.59 MB/s 0s 

から始まり、完了時に行く:

12.64 MB/12.64 MB [======================] 100.00% 626.67 KB/s 20s 

HTTP Reqをハンドラがメモリにファイルを読み込むと、プログレスバーが増加しているので、このですか?私は何が欠けていますか?

私はこの記事(Go: Tracking POST request progress)をチェックアウトしましたが、使用しているライブラリとどのように違うのか分かりません。私はこれまでバッファーにio.Copyを使って試してみましたが、バッファーにはプログレスバーリーダーが表示されていますが、要求が送信されるとすぐに同じことが行われます。私はコメントに書いたように

+1

コードが不完全です。 [最小、完全、および検証可能な例]を提供してください(http://stackoverflow.com/help/mcve)。 –

答えて

1

、あなたの質問には、すべての必要な情報が含まれていますが、ここでは、プログレスバーでリモートサーバにmultipart-formとしてファイルをポストサンプルアプリケーションではありません。

package main 

import (
    "github.com/cheggaaa/pb" 
    "os" 
    "time" 
    "bytes" 
    "mime/multipart" 
    "io" 
    "io/ioutil" 
    "net/http" 
) 

func main() { 
    body := &bytes.Buffer{} 
    bodyWriter := multipart.NewWriter(body) 

    fw, _ := bodyWriter.CreateFormFile("file", "filename.jpg") 
    fh, _ := os.Open("filename.jpg") 

    io.Copy(fw, fh) 
    bodyWriter.Close() 

    bar := pb.New(body.Len()).SetUnits(pb.U_BYTES).SetRefreshRate(time.Millisecond * 10) 
    bar.ShowSpeed = true 
    bar.Start() 

    reader := bar.NewProxyReader(body) 

    resp, _ := http.Post("http://domain.com", bodyWriter.FormDataContentType(), reader) 
    defer resp.Body.Close() 

    response, _ := ioutil.ReadAll(resp.Body) 
    print(string(response)) 
} 
+0

ありがとう!私はmultipart-formアップロードを使用したくない/使用できないようにしました。私はそれがうまくいった。 –

0

ガット他のパッケージがHTTPリクエストに問題を引き起こしていたことが判明しました。以下のコードは完全に動作します。

package main 

import(
    pb "gopkg.in/cheggaaa/pb.v1" 
    "fmt" 
    "os" 
    "log" 
    "io/ioutil" 
    "net/http" 
) 

func main() { 
    path := "/Users/me/testfile.txt" 
    file, e := os.Open(path) 
    if e != nil { 
     log.Fatal("File Error") 
    } 
    defer file.Close() 
    fi, e := file.Stat() 
    if e != nil { 
     log.Fatal("File Stat Error") 
    } 

    bar := pb.New(int(fi.Size())) 
    bar.Start() 

    client := &http.Client{} 
    req, e := http.NewRequest("POST", "http://posttestserver.com/post.php", bar.NewProxyReader(file)) 
    if e != nil { 
     log.Fatal("Request Error") 
    } 
    resp, e := client.Do(req) 
    if e != nil { 
     log.Fatal("Response Error") 
    } 
    bar.Finish() 
    respBody, e := ioutil.ReadAll(resp.Body) 
    fmt.Println(string(respBody)) 

    return 
} 

http://posttestserver.comのおかげで簡単にトラブルシューティングを行うことができます。

関連する問題