|
|
|
@ -6,6 +6,7 @@ package storage |
|
|
|
|
import ( |
|
|
|
|
"context" |
|
|
|
|
"crypto/tls" |
|
|
|
|
"fmt" |
|
|
|
|
"io" |
|
|
|
|
"net/http" |
|
|
|
|
"net/url" |
|
|
|
@ -53,10 +54,12 @@ type MinioStorageConfig struct { |
|
|
|
|
BasePath string `ini:"MINIO_BASE_PATH"` |
|
|
|
|
UseSSL bool `ini:"MINIO_USE_SSL"` |
|
|
|
|
InsecureSkipVerify bool `ini:"MINIO_INSECURE_SKIP_VERIFY"` |
|
|
|
|
ChecksumAlgorithm string `ini:"MINIO_CHECKSUM_ALGORITHM"` |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// MinioStorage returns a minio bucket storage
|
|
|
|
|
type MinioStorage struct { |
|
|
|
|
cfg *MinioStorageConfig |
|
|
|
|
ctx context.Context |
|
|
|
|
client *minio.Client |
|
|
|
|
bucket string |
|
|
|
@ -91,6 +94,10 @@ func NewMinioStorage(ctx context.Context, cfg interface{}) (ObjectStorage, error |
|
|
|
|
} |
|
|
|
|
config := configInterface.(MinioStorageConfig) |
|
|
|
|
|
|
|
|
|
if config.ChecksumAlgorithm != "" && config.ChecksumAlgorithm != "default" && config.ChecksumAlgorithm != "md5" { |
|
|
|
|
return nil, fmt.Errorf("invalid minio checksum algorithm: %s", config.ChecksumAlgorithm) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
log.Info("Creating Minio storage at %s:%s with base path %s", config.Endpoint, config.Bucket, config.BasePath) |
|
|
|
|
|
|
|
|
|
minioClient, err := minio.New(config.Endpoint, &minio.Options{ |
|
|
|
@ -113,6 +120,7 @@ func NewMinioStorage(ctx context.Context, cfg interface{}) (ObjectStorage, error |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return &MinioStorage{ |
|
|
|
|
cfg: &config, |
|
|
|
|
ctx: ctx, |
|
|
|
|
client: minioClient, |
|
|
|
|
bucket: config.Bucket, |
|
|
|
@ -124,7 +132,7 @@ func (m *MinioStorage) buildMinioPath(p string) string { |
|
|
|
|
return util.PathJoinRelX(m.basePath, p) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Open open a file
|
|
|
|
|
// Open opens a file
|
|
|
|
|
func (m *MinioStorage) Open(path string) (Object, error) { |
|
|
|
|
opts := minio.GetObjectOptions{} |
|
|
|
|
object, err := m.client.GetObject(m.ctx, m.bucket, m.buildMinioPath(path), opts) |
|
|
|
@ -134,7 +142,7 @@ func (m *MinioStorage) Open(path string) (Object, error) { |
|
|
|
|
return &minioObject{object}, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Save save a file to minio
|
|
|
|
|
// Save saves a file to minio
|
|
|
|
|
func (m *MinioStorage) Save(path string, r io.Reader, size int64) (int64, error) { |
|
|
|
|
uploadInfo, err := m.client.PutObject( |
|
|
|
|
m.ctx, |
|
|
|
@ -142,7 +150,14 @@ func (m *MinioStorage) Save(path string, r io.Reader, size int64) (int64, error) |
|
|
|
|
m.buildMinioPath(path), |
|
|
|
|
r, |
|
|
|
|
size, |
|
|
|
|
minio.PutObjectOptions{ContentType: "application/octet-stream"}, |
|
|
|
|
minio.PutObjectOptions{ |
|
|
|
|
ContentType: "application/octet-stream", |
|
|
|
|
// some storages like:
|
|
|
|
|
// * https://developers.cloudflare.com/r2/api/s3/api/
|
|
|
|
|
// * https://www.backblaze.com/b2/docs/s3_compatible_api.html
|
|
|
|
|
// do not support "x-amz-checksum-algorithm" header, so use legacy MD5 checksum
|
|
|
|
|
SendContentMd5: m.cfg.ChecksumAlgorithm == "md5", |
|
|
|
|
}, |
|
|
|
|
) |
|
|
|
|
if err != nil { |
|
|
|
|
return 0, convertMinioErr(err) |
|
|
|
|