diff options
Diffstat (limited to 'modules/storage/minio.go')
-rw-r--r-- | modules/storage/minio.go | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/modules/storage/minio.go b/modules/storage/minio.go index 30751755f3..d205eff7fd 100644 --- a/modules/storage/minio.go +++ b/modules/storage/minio.go @@ -22,6 +22,19 @@ var ( quoteEscaper = strings.NewReplacer("\\", "\\\\", `"`, "\\\"") ) +type minioObject struct { + *minio.Object +} + +func (m *minioObject) Stat() (os.FileInfo, error) { + oi, err := m.Object.Stat() + if err != nil { + return nil, err + } + + return &minioFileInfo{oi}, nil +} + // MinioStorage returns a minio bucket storage type MinioStorage struct { ctx context.Context @@ -69,7 +82,7 @@ func (m *MinioStorage) Open(path string) (Object, error) { if err != nil { return nil, err } - return object, nil + return &minioObject{object}, nil } // Save save a file to minio @@ -104,8 +117,20 @@ func (m minioFileInfo) ModTime() time.Time { return m.LastModified } +func (m minioFileInfo) IsDir() bool { + return strings.HasSuffix(m.ObjectInfo.Key, "/") +} + +func (m minioFileInfo) Mode() os.FileMode { + return os.ModePerm +} + +func (m minioFileInfo) Sys() interface{} { + return nil +} + // Stat returns the stat information of the object -func (m *MinioStorage) Stat(path string) (ObjectInfo, error) { +func (m *MinioStorage) Stat(path string) (os.FileInfo, error) { info, err := m.client.StatObject( m.ctx, m.bucket, @@ -135,3 +160,26 @@ func (m *MinioStorage) URL(path, name string) (*url.URL, error) { reqParams.Set("response-content-disposition", "attachment; filename=\""+quoteEscaper.Replace(name)+"\"") return m.client.PresignedGetObject(m.ctx, m.bucket, m.buildMinioPath(path), 5*time.Minute, reqParams) } + +// IterateObjects iterates across the objects in the miniostorage +func (m *MinioStorage) IterateObjects(fn func(path string, obj Object) error) error { + var opts = minio.GetObjectOptions{} + lobjectCtx, cancel := context.WithCancel(m.ctx) + defer cancel() + for mObjInfo := range m.client.ListObjects(lobjectCtx, m.bucket, minio.ListObjectsOptions{ + Prefix: m.basePath, + Recursive: true, + }) { + object, err := m.client.GetObject(lobjectCtx, m.bucket, mObjInfo.Key, opts) + if err != nil { + return err + } + if err := func(object *minio.Object, fn func(path string, obj Object) error) error { + defer object.Close() + return fn(strings.TrimPrefix(m.basePath, mObjInfo.Key), &minioObject{object}) + }(object, fn); err != nil { + return err + } + } + return nil +} |