Eric Bower
·
2025-06-08
minio.go
1package storage
2
3import (
4 "fmt"
5 "io"
6 "log/slog"
7 "net/http"
8 "os"
9 "path/filepath"
10 "strings"
11
12 sst "github.com/picosh/pico/pkg/pobj/storage"
13 "github.com/picosh/pico/pkg/shared/mime"
14)
15
16type StorageMinio struct {
17 *sst.StorageMinio
18}
19
20func NewStorageMinio(logger *slog.Logger, address, user, pass string) (*StorageMinio, error) {
21 st, err := sst.NewStorageMinio(logger, address, user, pass)
22 if err != nil {
23 return nil, err
24 }
25 return &StorageMinio{st}, nil
26}
27
28func (s *StorageMinio) ServeObject(r *http.Request, bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
29 var rc io.ReadCloser
30 info := &sst.ObjectInfo{}
31 var err error
32 mimeType := mime.GetMimeType(fpath)
33 if !strings.HasPrefix(mimeType, "image/") || opts == nil || os.Getenv("IMGPROXY_URL") == "" {
34 rc, info, err = s.GetObject(bucket, fpath)
35 if info.Metadata == nil {
36 info.Metadata = map[string][]string{}
37 }
38 // Minio always returns application/octet-stream which needs to be overridden.
39 info.Metadata.Set("content-type", mimeType)
40 } else {
41 filePath := filepath.Join(bucket.Name, fpath)
42 dataURL := fmt.Sprintf("s3://%s", filePath)
43 rc, info, err = HandleProxy(r, s.Logger, dataURL, opts)
44 }
45 if err != nil {
46 return nil, nil, err
47 }
48 return rc, info, err
49}