Go 如何获取io.reader对象的大小

Go 如何获取io.reader对象的大小,go,Go,我希望获得io.reader的大小,以返回bse64关注点的图片长度 主要问题是获取dec的大小以返回内容长度头 这是我的密码: 主程序包 进口( “fmt” “net/http” “时间” “strconv” “io” base64“编码/base64” “字节” ) func pix(w http.ResponseWriter,r*http.Request){ fmt.Fprintf(w,“你好,我爱%s!”,r.URL.Path[1:]) cookie,quot:=r.cookie(“cs

我希望获得io.reader的大小,以返回bse64关注点的图片长度

主要问题是获取dec的大小以返回内容长度头

这是我的密码:

主程序包
进口(
“fmt”
“net/http”
“时间”
“strconv”
“io”
base64“编码/base64”
“字节”
)
func pix(w http.ResponseWriter,r*http.Request){
fmt.Fprintf(w,“你好,我爱%s!”,r.URL.Path[1:])
cookie,quot:=r.cookie(“csrftoken”)
fmt.Printf(cookie.Value)
}
func img(w http.ResponseWriter,r*http.Request){
过期时间:=time.Now().Add(365*24*time.Hour)
cookie:=http.cookie{Name:“csrftoken”,值:“abcd”,Expires:expirement,HttpOnly:false}
http.SetCookie(w,&cookie)
img:=bytes.NewBufferString("一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究工具,一种新的研究方法,一种新的研究工具,一种新的研究工具,一种新的研究工具,一种新的研究工具,一种新的研究工具,一种新的理论,一种新的工具,一种新的研究方法,一种新的工具,一种新的研究,一种新的研究,一种新的研究,一种新的政府,一种新的研究,一种新的政府,一种新的研究,一种新的理论,新的非非非非非政府的政府,即,即,即,即一种准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准8Kiipi2.2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 TBHJRIDJ6SAVPKEXX2.一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国+aNGdWCOEKnJRmpr5oFVQV8WTWglIKHMlPhv5uqQ1xGYfB5fRMPo+n2VmFbi7ChiS9oWBhZvXrI01TNLg7yPxt51v9rxMfysXwsH8vH+g+wfgDUr+5LcyNV4AAAAABJRU5ErkJggg=”)
dec:=base64.NewDecoder(base64.StdEncoding,img)
w、 Header().Set(“内容类型”、“图像/jpeg”)
//这里的问题是,我想得到返回图片长度的大小(lend(dec))
w、 Header().Set(“内容长度”,strconv.Itoa(len(dec)))
io.副本(w,12月)
}
func main(){
http.HandleFunc(“/pix/”,pix)
http.HandleFunc(“/img/”,img)
http.HandleFunc(“/red/”,img)
http.HandleFunc(“/”,img)
http.listendServe(“:8080”,无)
}

问候和感谢

,因为
io.Reader
接口对底层数据的大小和长度一无所知,
有两个选项:
1-使用缓冲区并读取或复制所有数据:

buf:=&bytes.Buffer{}
nRead,err:=io.Copy(buf,dec)
如果错误!=零{
fmt.Println(错误)
}
w、 Header().Set(“内容长度”,strconv.FormatInt(nRead,10))//len(dec)
与此工作示例代码类似:

主程序包
进口(
“字节”
base64“编码/base64”
“fmt”
“io”
“net/http”
“strconv”
“时间”
)
func pix(w http.ResponseWriter,r*http.Request){
fmt.Fprintf(w,“你好,我爱%s!”,r.URL.Path[1:])
cookie,quot:=r.cookie(“csrftoken”)
fmt.Printf(cookie.Value)
}
func img(w http.ResponseWriter,r*http.Request){
过期时间:=time.Now().Add(365*24*time.Hour)
cookie:=http.cookie{Name:“csrftoken”,值:“abcd”,Expires:expirement,HttpOnly:false}
http.SetCookie(w,&cookie)
img:=字节。NewBufferString(“一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究工具,一种新的研究方法,一种新的研究工具,一种新的研究工具,一种新的研究工具,一种新的研究工具,一种新的研究工具,一种新的理论,一种新的工具,一种新的研究方法,一种新的工具,一种新的研究,一种新的研究,一种新的研究,一种新的政府,一种新的研究,一种新的政府,一种新的研究,一种新的理论,新的非非非非非政府的政府,即,即,即,即一种准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准8Kiipi2.2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 TBHJRIDJ6SAVPKEXX2.一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国+aNGdWCOEKnJRmpr5oFVQV8WTWglIKHMlPhv5uqQ1xGYfB5fRMPo+n2VmFbi7ChiS9oWBhZvXrI01TNLg7yPxt51v9rxMfysXwsH8vH+g+wfgDUr+5LcyNV4AAAAABJRU5ErkJggg=”)
dec:=base64.NewDecoder(base64.StdEncoding,img)
w、 Header().Set(“内容类型”、“图像/jpeg”)
buf:=&bytes.Buffer{}
nRead,err:=io.Copy(buf,dec)
如果错误!=零{
fmt.Println(错误)
}
w、 Header().Set(“内容长度”,strconv.FormatInt(nRead,10))//len(dec)
io.副本(w,buf)
}
func main(){
http.HandleFunc(“/pix/”,pix)
http.HandleFunc(“/img/”,img)
http.HandleFunc(“/red/”,img)
http.HandleFunc(“/”,img)
http.listendServe(“:8080”,无)
}

2-不要设置标题大小,如下面的工作示例代码:

主程序包
进口(
“字节”
base64“编码/base64”
“fmt”
“io”
“net/http”
“时间”
)
func pix(w http.ResponseWriter,r*http.Request){
fmt.Fprintf(w,“你好,我爱%s!”,r.URL.Path[1:])
cookie,quot:=r.cookie(“csrftoken”)
fmt.Printf(cookie.Value)
}
func img(w http.ResponseWriter,r*http.Request){
过期时间:=time.Now().Add(365*24*time.Hour)
cookie:=http.cookie{Name:“csrftoken”,值:“abcd”,Expires:expirement,HttpOnly:false}
http.SetCookie(w,&cookie)
img:=bytes.NewBufferString(“ivborw0kgoaaaansuhueugaadiaaaycaiaacrxr/maadmuleqvryw+2ytuguyrjhzojiona+rruyynirqgrhalo4qfdbegunsxs9tfu0qenhih6ivokruzo2uamrmbg6xmr/mvakzpzvvvo143zszszsxoz+yahNm+785sITEP
func img(w http.ResponseWriter, r *http.Request) {
  expiration := time.Now().Add(365 * 24 * time.Hour)
  cookie := http.Cookie{Name: "csrftoken",Value:"abcd",Expires:expiration,HttpOnly: false}
  http.SetCookie(w, &cookie)

  img := bytes.NewBufferString("iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAADMUlEQVRYw+2YTUgUYRjHZzOJIoNA+rrUyYNIRQgRHaLo4qFDBEGeunSxS9TFU0QEnhIh6IvokrUzO2uamRmbG6XmR/mVaKZpZVbYvvO143zszsxOz+yahNm+785sITEP72F3Z+adH8/zf5+PpagwtxKXj+Vj+Vg+lo/lY+W+WI4KpddKwWIQFUSF97nNLcLGZt75SiOHchEXfskDVmYjlowpiEoei3UT2ljcFJOpOd169C1Z2SuvgsdpB7cgzB16EV/byGM2xDIVPxQujKmBDF/2m2l0vFvmEin7N2v8kiiPiOeGlGHRvP1RdxA9eYtGR7pk2Pf6lI7RCoP2RaWkZWe3fsFc18hvesAHPGEFUc24ltnx3kyiCJwfRMs6dTXLdSIjO9Osal18qzKfE5V9coDxhlU7qS3uOyiaB55JDtkS2TKoLCLaOLPS4b02pQdCHiUfRKf653/d2kjZN6f10jYxI2EnrGk5H+2WsVi6ZZ8fVSmGQKaYyyFuR6ugmUtVrJo2C7HokeGq8447sYpOPBbo3XFzKC95626sZlz905sUM9XLGbXvtKtTOhZrQDApkhNNkiAOPo/viojh2YSZsj1aF2eQ5n2stuomNQjiiGQanrFufdCXP8gu8tbhjridJ6saVPKExXJrwlwfb3pnAg2Ut0tEBZFI8gza81Tik15DCDIoINQ7aQdBo90RMfrdwNaWLFY9opJGkBQrhCA/HXspQ8W1XHkN6vfWFiGH9ouwhdpJUFuy2JX3eg6uyqENpNHZYcUd02jcLMI2WO67UwZVv1G1HLMq3L83KuEbLPdY7IL2L42p0MMQiuzkq/ncwucOi6qPbWkWoPfCUsENpweUnP1EmE4XGhgagT72RyXolkSCHBbTU3By3fgJj8VyJW3CmSHl8oTWMJuYUUizVvtcsuyJ6J4J663CMLevXar/lJgnKNSgbphzKjriTn5i0F8eX9ODXnEzf6JHvjGtv+aNGdWCOEKnJRmpr5oFVQV8WTWglIKHMlPhv5uqQ1xGYfB5fRMPo+n2VmFbi7ChiS9oWBhZvXrI01TNLg7yPxt51v9rxMfysXwsH8vH+g+wfgDUr+5LcyNV4AAAAABJRU5ErkJggg==")
  dec := base64.NewDecoder(base64.StdEncoding, img)
  w.Header().Set("Content-Type", "image/jpeg")
  io.Copy(w, dec)
}
img := strings.NewReader("iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAADMUlEQVRYw+2YTUgUYRjHZzOJIoNA+rrUyYNIRQgRHaLo4qFDBEGeunSxS9TFU0QEnhIh6IvokrUzO2uamRmbG6XmR/mVaKZpZVbYvvO143zszsxOz+yahNm+785sITEP72F3Z+adH8/zf5+PpagwtxKXj+Vj+Vg+lo/lY+W+WI4KpddKwWIQFUSF97nNLcLGZt75SiOHchEXfskDVmYjlowpiEoei3UT2ljcFJOpOd169C1Z2SuvgsdpB7cgzB16EV/byGM2xDIVPxQujKmBDF/2m2l0vFvmEin7N2v8kiiPiOeGlGHRvP1RdxA9eYtGR7pk2Pf6lI7RCoP2RaWkZWe3fsFc18hvesAHPGEFUc24ltnx3kyiCJwfRMs6dTXLdSIjO9Osal18qzKfE5V9coDxhlU7qS3uOyiaB55JDtkS2TKoLCLaOLPS4b02pQdCHiUfRKf653/d2kjZN6f10jYxI2EnrGk5H+2WsVi6ZZ8fVSmGQKaYyyFuR6ugmUtVrJo2C7HokeGq8447sYpOPBbo3XFzKC95626sZlz905sUM9XLGbXvtKtTOhZrQDApkhNNkiAOPo/viojh2YSZsj1aF2eQ5n2stuomNQjiiGQanrFufdCXP8gu8tbhjridJ6saVPKExXJrwlwfb3pnAg2Ut0tEBZFI8gza81Tik15DCDIoINQ7aQdBo90RMfrdwNaWLFY9opJGkBQrhCA/HXspQ8W1XHkN6vfWFiGH9ouwhdpJUFuy2JX3eg6uyqENpNHZYcUd02jcLMI2WO67UwZVv1G1HLMq3L83KuEbLPdY7IL2L42p0MMQiuzkq/ncwucOi6qPbWkWoPfCUsENpweUnP1EmE4XGhgagT72RyXolkSCHBbTU3By3fgJj8VyJW3CmSHl8oTWMJuYUUizVvtcsuyJ6J4J663CMLevXar/lJgnKNSgbphzKjriTn5i0F8eX9ODXnEzf6JHvjGtv+aNGdWCOEKnJRmpr5oFVQV8WTWglIKHMlPhv5uqQ1xGYfB5fRMPo+n2VmFbi7ChiS9oWBhZvXrI01TNLg7yPxt51v9rxMfysXwsH8vH+g+wfgDUr+5LcyNV4AAAAABJRU5ErkJggg==")
func img(w http.ResponseWriter, r *http.Request) {
  expiration := time.Now().Add(365 * 24 * time.Hour)
  cookie := http.Cookie{Name: "csrftoken",Value:"abcd",Expires:expiration,HttpOnly: false}
  http.SetCookie(w, &cookie)

  p, err := base64.StdEncoding.DecodeString("iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAADMUlEQVRYw+2YTUgUYRjHZzOJIoNA+rrUyYNIRQgRHaLo4qFDBEGeunSxS9TFU0QEnhIh6IvokrUzO2uamRmbG6XmR/mVaKZpZVbYvvO143zszsxOz+yahNm+785sITEP72F3Z+adH8/zf5+PpagwtxKXj+Vj+Vg+lo/lY+W+WI4KpddKwWIQFUSF97nNLcLGZt75SiOHchEXfskDVmYjlowpiEoei3UT2ljcFJOpOd169C1Z2SuvgsdpB7cgzB16EV/byGM2xDIVPxQujKmBDF/2m2l0vFvmEin7N2v8kiiPiOeGlGHRvP1RdxA9eYtGR7pk2Pf6lI7RCoP2RaWkZWe3fsFc18hvesAHPGEFUc24ltnx3kyiCJwfRMs6dTXLdSIjO9Osal18qzKfE5V9coDxhlU7qS3uOyiaB55JDtkS2TKoLCLaOLPS4b02pQdCHiUfRKf653/d2kjZN6f10jYxI2EnrGk5H+2WsVi6ZZ8fVSmGQKaYyyFuR6ugmUtVrJo2C7HokeGq8447sYpOPBbo3XFzKC95626sZlz905sUM9XLGbXvtKtTOhZrQDApkhNNkiAOPo/viojh2YSZsj1aF2eQ5n2stuomNQjiiGQanrFufdCXP8gu8tbhjridJ6saVPKExXJrwlwfb3pnAg2Ut0tEBZFI8gza81Tik15DCDIoINQ7aQdBo90RMfrdwNaWLFY9opJGkBQrhCA/HXspQ8W1XHkN6vfWFiGH9ouwhdpJUFuy2JX3eg6uyqENpNHZYcUd02jcLMI2WO67UwZVv1G1HLMq3L83KuEbLPdY7IL2L42p0MMQiuzkq/ncwucOi6qPbWkWoPfCUsENpweUnP1EmE4XGhgagT72RyXolkSCHBbTU3By3fgJj8VyJW3CmSHl8oTWMJuYUUizVvtcsuyJ6J4J663CMLevXar/lJgnKNSgbphzKjriTn5i0F8eX9ODXnEzf6JHvjGtv+aNGdWCOEKnJRmpr5oFVQV8WTWglIKHMlPhv5uqQ1xGYfB5fRMPo+n2VmFbi7ChiS9oWBhZvXrI01TNLg7yPxt51v9rxMfysXwsH8vH+g+wfgDUr+5LcyNV4AAAAABJRU5ErkJggg==")
  if err != nil {
    http.Error(w, "internal error", 500)
    return
  }
  w.Header().Set("Content-Type", "image/jpeg")
  w.Header().Set("Content-Length", strconv.Itoa(len(p)))
  w.Write(p)
}
func getSize(stream io.Reader) int {
    buf := new(bytes.Buffer)
    buf.ReadFrom(stream)
    return buf.Len()
}