// Update the Object from in with modTime and size func (o *Object) Update(in io.Reader, src fs.ObjectInfo) error { modTime := src.ModTime() uploader := s3manager.NewUploader(o.fs.ses, func(u *s3manager.Uploader) { u.Concurrency = 2 u.LeavePartsOnError = false u.S3 = o.fs.c u.PartSize = s3manager.MinUploadPartSize size := src.Size() // Adjust PartSize until the number of parts is small enough. if size/u.PartSize >= s3manager.MaxUploadParts { // Calculate partition size rounded up to the nearest MB u.PartSize = (((size / s3manager.MaxUploadParts) >> 20) + 1) << 20 } }) // Set the mtime in the meta data metadata := map[string]*string{ metaMtime: aws.String(swift.TimeToFloatString(modTime)), } // Guess the content type mimeType := fs.MimeType(src) key := o.fs.root + o.remote req := s3manager.UploadInput{ Bucket: &o.fs.bucket, ACL: &o.fs.acl, Key: &key, Body: in, ContentType: &mimeType, Metadata: metadata, //ContentLength: &size, } if o.fs.sse != "" { req.ServerSideEncryption = &o.fs.sse } if o.fs.storageClass != "" { req.StorageClass = &o.fs.storageClass } _, err := uploader.Upload(&req) if err != nil { return err } // Read the metadata from the newly created object o.meta = nil // wipe old metadata err = o.readMetaData() return err }
func (self *S3Filesystem) Create(src File) error { var fullpath string if self.path == "" || strings.HasSuffix(self.path, "/") { fullpath = filepath.Join(self.path, src.Relative()) } else { fullpath = self.path } input := s3manager.UploadInput{ ACL: aws.String(acl), Bucket: aws.String(self.bucket), Key: aws.String(fullpath), } switch t := src.(type) { case *S3File: // special case for S3File to preserve header information getObjectInput := s3.GetObjectInput{ Bucket: aws.String(t.bucket), Key: t.object.Key, } output, err := self.conn.GetObject(&getObjectInput) if err != nil { return err } defer output.Body.Close() input.Body = output.Body // transfer existing headers across input.ContentType = output.ContentType // input.LastModified = output.LastModified input.StorageClass = output.StorageClass default: reader, err := src.Reader() if err != nil { return err } input.Body = reader defer reader.Close() input.ContentType = aws.String(guessMimeType(src.Relative())) } u := s3manager.NewUploaderWithClient(self.conn) _, err := u.Upload(&input) return err }