mirror of
https://github.com/imgproxy/imgproxy.git
synced 2026-06-18 17:43:40 +02:00
Implement fallback images in a similar fashion to watermarks. (#374)
* 220. Implement fallback images in a similar fashion to watermarks. * 220. Fix error formatting. * 220. Fixes based on @darthsim's feedback.
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
func getWatermarkData() (*imageData, error) {
|
||||
if len(conf.WatermarkData) > 0 {
|
||||
return base64ImageData(conf.WatermarkData)
|
||||
}
|
||||
|
||||
if len(conf.WatermarkPath) > 0 {
|
||||
return fileImageData(conf.WatermarkPath)
|
||||
}
|
||||
|
||||
if len(conf.WatermarkURL) > 0 {
|
||||
return remoteImageData(conf.WatermarkURL)
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func getFallbackImageData() (*imageData, error) {
|
||||
if len(conf.FallbackImageData) > 0 {
|
||||
return base64ImageData(conf.FallbackImageData)
|
||||
}
|
||||
|
||||
if len(conf.FallbackImagePath) > 0 {
|
||||
return fileImageData(conf.FallbackImagePath)
|
||||
}
|
||||
|
||||
if len(conf.FallbackImageURL) > 0 {
|
||||
return remoteImageData(conf.FallbackImageURL)
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func base64ImageData(encoded string) (*imageData, error) {
|
||||
data, err := base64.StdEncoding.DecodeString(encoded)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Can't decode image data: %s", err)
|
||||
}
|
||||
|
||||
imgtype, err := checkTypeAndDimensions(bytes.NewReader(data))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Can't decode image: %s", err)
|
||||
}
|
||||
|
||||
return &imageData{Data: data, Type: imgtype}, nil
|
||||
}
|
||||
|
||||
func fileImageData(path string) (*imageData, error) {
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Can't read watermark: %s", err)
|
||||
}
|
||||
|
||||
fi, err := f.Stat()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Can't read watermark: %s", err)
|
||||
}
|
||||
|
||||
imgdata, err := readAndCheckImage(f, int(fi.Size()))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Can't read watermark: %s", err)
|
||||
}
|
||||
|
||||
return imgdata, err
|
||||
}
|
||||
|
||||
func remoteImageData(imageURL string) (*imageData, error) {
|
||||
res, err := requestImage(imageURL)
|
||||
if res != nil {
|
||||
defer res.Body.Close()
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Can't download image: %s", err)
|
||||
}
|
||||
|
||||
imgdata, err := readAndCheckImage(res.Body, int(res.ContentLength))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Can't download image: %s", err)
|
||||
}
|
||||
|
||||
return imgdata, err
|
||||
}
|
||||
Reference in New Issue
Block a user