factory.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package auximageprovider
  2. import (
  3. "context"
  4. "net/http"
  5. "github.com/imgproxy/imgproxy/v3/imagedatanew"
  6. "github.com/imgproxy/imgproxy/v3/imagedownloader"
  7. "github.com/imgproxy/imgproxy/v3/security"
  8. )
  9. // Factory is a struct that provides methods to create ImageProvider instances.
  10. type Factory struct {
  11. downloader *imagedownloader.Downloader
  12. }
  13. // NewFactory creates a new Factory instance with the given downloader.
  14. func NewFactory(downloader *imagedownloader.Downloader) *Factory {
  15. return &Factory{
  16. downloader: downloader,
  17. }
  18. }
  19. // NewMemoryFromBase64 creates a new ImageProvider from a base64 encoded string.
  20. // It stores image in memory.
  21. func (f *Factory) NewMemoryFromBase64(b64 string) (AuxImageProvider, error) {
  22. img, err := imagedatanew.NewFromBase64(b64, make(http.Header), security.DefaultOptions())
  23. if err != nil {
  24. return nil, err
  25. }
  26. return newStaticAuxImageProvider(img, make(http.Header)), nil
  27. }
  28. // NewMemoryFromFile creates a new ImageProvider from a local file path.
  29. // It stores image in memory.
  30. func (f *Factory) NewMemoryFromFile(path string) (AuxImageProvider, error) {
  31. img, err := imagedatanew.NewFromFile(path, make(http.Header), security.DefaultOptions())
  32. if err != nil {
  33. return nil, err
  34. }
  35. return newStaticAuxImageProvider(img, make(http.Header)), nil
  36. }
  37. // NewMemoryURL creates a new ImageProvider from a URL.
  38. func (f *Factory) NewMemoryURL(ctx context.Context, url string) (AuxImageProvider, error) {
  39. img, err := f.downloader.DownloadWithDesc(ctx, url, "ImageProvider", imagedownloader.DownloadOptions{}, security.DefaultOptions())
  40. if err != nil {
  41. return nil, err
  42. }
  43. //nolint:staticcheck
  44. return newStaticAuxImageProvider(img, img.Headers()), nil
  45. }
  46. // NewMemoryTriple creates a new ImageProvider from either a base64 string, file path, or URL
  47. func (f *Factory) NewMemoryTriple(b64 string, path string, url string) (AuxImageProvider, error) {
  48. switch {
  49. case len(b64) > 0:
  50. return f.NewMemoryFromBase64(b64)
  51. case len(path) > 0:
  52. return f.NewMemoryFromFile(path)
  53. case len(url) > 0:
  54. return f.NewMemoryURL(context.Background(), url)
  55. }
  56. return nil, nil
  57. }