factory.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package imagedata
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "io"
  6. "os"
  7. "github.com/imgproxy/imgproxy/v3/imagemeta"
  8. "github.com/imgproxy/imgproxy/v3/imagetype"
  9. "github.com/imgproxy/imgproxy/v3/security"
  10. )
  11. // NewFromBytesWithFormat creates a new ImageData instance from the provided format
  12. // and byte slice.
  13. func NewFromBytesWithFormat(format imagetype.Type, b []byte) ImageData {
  14. return &imageDataBytes{
  15. data: b,
  16. format: format,
  17. cancel: nil,
  18. }
  19. }
  20. // NewFromBytes creates a new ImageData instance from the provided byte slice.
  21. func NewFromBytes(b []byte) (ImageData, error) {
  22. r := bytes.NewReader(b)
  23. meta, err := imagemeta.DecodeMeta(r)
  24. if err != nil {
  25. return nil, err
  26. }
  27. return NewFromBytesWithFormat(meta.Format(), b), nil
  28. }
  29. // NewFromPath creates a new ImageData from an os.File
  30. func NewFromPath(path string, secopts security.Options) (ImageData, error) {
  31. f, err := os.Open(path)
  32. if err != nil {
  33. return nil, err
  34. }
  35. defer f.Close()
  36. fr, err := security.LimitFileSize(f, secopts)
  37. if err != nil {
  38. return nil, err
  39. }
  40. b, err := io.ReadAll(fr)
  41. if err != nil {
  42. return nil, err
  43. }
  44. r := bytes.NewReader(b)
  45. // NOTE: This will be removed in the future in favor of VIPS metadata extraction
  46. // It's here temporarily to maintain compatibility with existing code
  47. meta, err := imagemeta.DecodeMeta(r)
  48. if err != nil {
  49. return nil, err
  50. }
  51. err = security.CheckMeta(meta, secopts)
  52. if err != nil {
  53. return nil, err
  54. }
  55. return NewFromBytes(b)
  56. }
  57. // NewFromBase64 creates a new ImageData from a base64 encoded byte slice
  58. func NewFromBase64(encoded string, secopts security.Options) (ImageData, error) {
  59. b, err := base64.StdEncoding.DecodeString(encoded)
  60. if err != nil {
  61. return nil, err
  62. }
  63. r := bytes.NewReader(b)
  64. // NOTE: This will be removed in the future in favor of VIPS metadata extraction
  65. // It's here temporarily to maintain compatibility with existing code
  66. meta, err := imagemeta.DecodeMeta(r)
  67. if err != nil {
  68. return nil, err
  69. }
  70. err = security.CheckMeta(meta, secopts)
  71. if err != nil {
  72. return nil, err
  73. }
  74. return NewFromBytes(b)
  75. }