Http 为什么我的上传进度条在传输完成之前就完成了?
我正在向API发送POST请求,并使用第三方库(),但我的上载进度条将在文件传输实际完成之前完成Http 为什么我的上传进度条在传输完成之前就完成了?,http,post,go,progress-bar,httprequest,Http,Post,Go,Progress Bar,Httprequest,我正在向API发送POST请求,并使用第三方库(),但我的上载进度条将在文件传输实际完成之前完成 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
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处理程序正在将文件读入内存并增加进度条吗?我错过了什么
我查看了这篇文章,(),但我不认为这与我正在使用的图书馆有什么不同。我以前尝试过使用
io.Copy
将进程条读取器从中读取的内容复制到缓冲区,但一旦发送请求,它就会执行相同的操作 正如我在评论中所写,您的问题并不包含所有必需的信息,但下面是一个示例应用程序,它使用进度条将文件作为多部分表单
发布到远程服务器:
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))
}
明白了,原来是另一个包引起了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
}
感谢您为我提供了一个轻松解决问题的地方 您的代码不完整。请提供,谢谢!但我不想/不能使用多部分表单上载。不过,我确实解决了这个问题。