github.com/qiniu/go-sdk/v7@v7.27.0/types.go (about) 1 package api 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "net/http" 8 9 internal_io "github.com/qiniu/go-sdk/v7/internal/io" 10 ) 11 12 // BytesFromRequest 读取 http.Request.Body 的内容到 slice 中 13 func BytesFromRequest(r *http.Request) ([]byte, error) { 14 if bytesNopCloser, ok := r.Body.(*internal_io.BytesNopCloser); ok { 15 return bytesNopCloser.Bytes(), nil 16 } 17 18 // 不能大于10G 19 if r.ContentLength > 1024*1024*1024*10 { 20 return nil, fmt.Errorf("content length too large:%d", r.ContentLength) 21 } 22 23 contentLength := int(r.ContentLength) + 1024 24 buf := bytes.NewBuffer(make([]byte, 0, contentLength)) 25 _, err := io.Copy(buf, r.Body) 26 if err != nil { 27 return nil, err 28 } 29 return buf.Bytes(), nil 30 } 31 32 // SeekerLen 通过 io.Seeker 获取数据大小 33 func SeekerLen(s io.Seeker) (int64, error) { 34 curOffset, err := s.Seek(0, io.SeekCurrent) 35 if err != nil { 36 return 0, err 37 } 38 39 endOffset, err := s.Seek(0, io.SeekEnd) 40 if err != nil { 41 return 0, err 42 } 43 44 _, err = s.Seek(curOffset, io.SeekStart) 45 if err != nil { 46 return 0, err 47 } 48 49 return endOffset - curOffset, nil 50 }