mirror of
https://github.com/minio/mc.git
synced 2025-11-13 12:22:45 +03:00
Filesystem now calculates md5sum and returns
This commit is contained in:
@@ -19,6 +19,8 @@
|
||||
package fs
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"io"
|
||||
"os"
|
||||
@@ -58,7 +60,7 @@ func (f *fsClient) fsStat() (os.FileInfo, error) {
|
||||
}
|
||||
|
||||
// Get - download an object from bucket
|
||||
func (f *fsClient) Get() (body io.ReadCloser, size int64, md5 string, err error) {
|
||||
func (f *fsClient) Get() (io.ReadCloser, int64, string, error) {
|
||||
item, err := f.getFSMetadata()
|
||||
if err != nil {
|
||||
return nil, 0, "", iodine.New(err, nil)
|
||||
@@ -66,17 +68,27 @@ func (f *fsClient) Get() (body io.ReadCloser, size int64, md5 string, err error)
|
||||
if item.FileType.IsDir() {
|
||||
return nil, 0, "", iodine.New(FileISDir{path: f.path}, nil)
|
||||
}
|
||||
body, err = os.Open(f.path)
|
||||
body, err := os.Open(f.path)
|
||||
if err != nil {
|
||||
return nil, 0, "", iodine.New(err, nil)
|
||||
}
|
||||
// TODO: support md5sum - there is no easier way to do it right now without temporary buffer
|
||||
// so avoiding it to ensure no out of memory situations
|
||||
return body, item.Size, "", nil
|
||||
h := md5.New()
|
||||
// calculate md5sum
|
||||
_, err = io.Copy(h, body)
|
||||
if err != nil {
|
||||
return nil, 0, "", iodine.New(err, nil)
|
||||
}
|
||||
// seek back
|
||||
_, err = body.Seek(0, 0)
|
||||
if err != nil {
|
||||
return nil, 0, "", iodine.New(err, nil)
|
||||
}
|
||||
md5Str := hex.EncodeToString(h.Sum(nil))
|
||||
return body, item.Size, md5Str, nil
|
||||
}
|
||||
|
||||
// GetPartial - download a partial object from bucket
|
||||
func (f *fsClient) GetPartial(offset, length int64) (body io.ReadCloser, size int64, md5 string, err error) {
|
||||
func (f *fsClient) GetPartial(offset, length int64) (io.ReadCloser, int64, string, error) {
|
||||
if offset < 0 {
|
||||
return nil, 0, "", iodine.New(client.InvalidRange{Offset: offset}, nil)
|
||||
}
|
||||
@@ -90,11 +102,27 @@ func (f *fsClient) GetPartial(offset, length int64) (body io.ReadCloser, size in
|
||||
if offset > item.Size || (offset+length-1) > item.Size {
|
||||
return nil, 0, "", iodine.New(client.InvalidRange{Offset: offset}, nil)
|
||||
}
|
||||
body, err := os.Open(f.path)
|
||||
if err != nil {
|
||||
return nil, 0, "", iodine.New(err, nil)
|
||||
}
|
||||
_, err = io.CopyN(ioutil.Discard, body, offset)
|
||||
if err != nil {
|
||||
return nil, 0, "", iodine.New(err, nil)
|
||||
}
|
||||
return body, length, "", nil
|
||||
h := md5.New()
|
||||
// calculate md5sum
|
||||
_, err = io.Copy(h, body)
|
||||
if err != nil {
|
||||
return nil, 0, "", iodine.New(err, nil)
|
||||
}
|
||||
// seek back
|
||||
_, err = body.Seek(0, 0)
|
||||
if err != nil {
|
||||
return nil, 0, "", iodine.New(err, nil)
|
||||
}
|
||||
md5Str := hex.EncodeToString(h.Sum(nil))
|
||||
return body, length, md5Str, nil
|
||||
}
|
||||
|
||||
func (f *fsClient) List() <-chan client.ItemOnChannel {
|
||||
|
||||
Reference in New Issue
Block a user