1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- package main
- import (
- "bytes"
- "errors"
- "image"
- "net/http"
- _ "image/gif"
- _ "image/jpeg"
- _ "image/png"
- )
- const chunkSize = 4096
- func checkTypeAndDimensions(b []byte) error {
- imgconf, _, err := image.DecodeConfig(bytes.NewReader(b))
- if err != nil {
- return err
- }
- if imgconf.Width > conf.MaxSrcDimension || imgconf.Height > conf.MaxSrcDimension {
- return errors.New("File is too big")
- }
- return nil
- }
- func readAndCheckImage(res *http.Response) ([]byte, error) {
- b := make([]byte, chunkSize)
- n, err := res.Body.Read(b)
- if err != nil {
- return nil, err
- }
- if err = checkTypeAndDimensions(b[:n]); err != nil {
- return nil, err
- }
- buf := bytes.NewBuffer(b[:n])
- if res.ContentLength > 0 {
- buf.Grow(int(res.ContentLength))
- }
- if _, err = buf.ReadFrom(res.Body); err != nil {
- return nil, err
- }
- return buf.Bytes(), nil
- }
- func downloadImage(url string) ([]byte, error) {
- res, err := http.Get(url)
- if err != nil {
- return nil, err
- }
- defer res.Body.Close()
- return readAndCheckImage(res)
- }
|