2017-01-24 4 views
0

Я отправляю POST-запрос в API и используя стороннюю библиотеку (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

Спасибо! Однако я не хотел/не мог использовать многостраничную загрузку. Я все-таки все понял. –

0

Got он, оказывается, еще один пакет вызывал проблемы с 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 за предоставленную мне где-то легко устранить!