How to read multiple times from same io.Reader

后端 未结 4 1882
一整个雨季
一整个雨季 2020-12-14 14:33

I want to use request.Body(type io.ReadCloser) which is containing a image.

I dont want to use ioutil.ReadAll() as i want to write this bod

4条回答
  •  情深已故
    2020-12-14 14:58

    io.Reader is treated like a stream. Because of this you cannot read it twice. Imagine the an incoming TCP connection. You cannot rewind the whats coming in.

    But you can use the io.TeeReader to duplicate the stream:

    package main
    
    import (
        "bytes"
        "io"
        "io/ioutil"
        "log"
        "strings"
    )
    
    func main() {
        r := strings.NewReader("some io.Reader stream to be read\n")
        var buf bytes.Buffer
        tee := io.TeeReader(r, &buf)
    
        log.Println(ioutil.ReadAll(tee))
        log.Println(ioutil.ReadAll(&buf)) 
    }
    

    Example on Go Playground

    Edit: As @mrclx pointed out: You need to read from the TeeReader first, otherwise the buffer will be empty.

提交回复
热议问题