diff --git a/s3/exporter/exporter.go b/s3/exporter/exporter.go index 108ed7c9..f395fe8d 100644 --- a/s3/exporter/exporter.go +++ b/s3/exporter/exporter.go @@ -19,6 +19,7 @@ package exporter import ( "context" "encoding/base64" + "encoding/json" "fmt" "net/url" "path" @@ -241,8 +242,21 @@ func (p *S3Exporter) Export(ctx context.Context, records <-chan *connectors.Reco g.Go(func() error { objname := strings.TrimLeft(path.Join(p.restoreDir, record.Pathname), "/") + var objectInfo minio.ObjectInfo + if len(record.ExtendedAttributes) > 0 { + if err := json.Unmarshal([]byte(record.ExtendedAttributes[0]), &objectInfo); err != nil { + objectInfo.UserTags = nil + objectInfo.UserMetadata = nil + } + } + _, err := p.minioClient.PutObject(ctx, p.bucket, objname, - record.Reader, record.FileInfo.Lsize, minio.PutObjectOptions{ServerSideEncryption: p.ssec}) + record.Reader, record.FileInfo.Lsize, minio.PutObjectOptions{ + ServerSideEncryption: p.ssec, + ContentType: objectInfo.ContentType, + UserTags: objectInfo.UserTags, + UserMetadata: objectInfo.UserMetadata, + }) results <- record.Error(err) return nil }) diff --git a/s3/importer/importer.go b/s3/importer/importer.go index 9599162c..327ff904 100644 --- a/s3/importer/importer.go +++ b/s3/importer/importer.go @@ -19,6 +19,7 @@ package importer import ( "context" "encoding/base64" + "encoding/json" "fmt" "io" "net/url" @@ -245,8 +246,19 @@ func (p *S3Importer) Import(ctx context.Context, records chan<- *connectors.Reco Ldev: 1, } - records <- connectors.NewRecord("/"+object.Key, "", fi, nil, func() (io.ReadCloser, error) { - return p.minioClient.GetObject(ctx, p.bucket, object.Key, minio.GetObjectOptions{ServerSideEncryption: p.ssec}) + var xattr []string + obj, err := p.minioClient.GetObject(ctx, p.bucket, object.Key, minio.GetObjectOptions{ServerSideEncryption: p.ssec}) + if err == nil { + if stat, err := obj.Stat(); err == nil { + xattrStr, err := json.Marshal(stat) + if err == nil { + xattr = append(xattr, string(xattrStr)) + } + } + } + + records <- connectors.NewRecord("/"+object.Key, "", fi, xattr, func() (io.ReadCloser, error) { + return obj, err }) }