Class: AWS::S3::MultipartUpload

Inherits:
Object
  • Object
show all
Defined in:
lib/aws/s3/multipart_upload.rb

Overview

Represents a multipart upload to an S3 object. See S3Object#multipart_upload for a convenient way to initiate a multipart upload.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#idString (readonly) Also known as: upload_id



47
48
49
# File 'lib/aws/s3/multipart_upload.rb', line 47

def id
  @id
end

#objectS3Object (readonly)



52
53
54
# File 'lib/aws/s3/multipart_upload.rb', line 52

def object
  @object
end

Instance Method Details

#==(other) ⇒ Boolean Also known as: eql?



56
57
58
59
60
# File 'lib/aws/s3/multipart_upload.rb', line 56

def ==(other)
  other.kind_of?(MultipartUpload) and
    other.object == object and
    other.id == id
end

#abortnil Also known as: delete, cancel

Aborts the upload. After a multipart upload is aborted, no additional parts can be uploaded using that upload ID. The storage consumed by any previously uploaded parts will be freed. However, if any part uploads are currently in progress, those part uploads might or might not succeed. As a result, it might be necessary to abort a given multipart upload multiple times in order to completely free all storage consumed by all parts.



112
113
114
115
116
# File 'lib/aws/s3/multipart_upload.rb', line 112

def abort
  client.abort_multipart_upload(base_opts)
  @aborted = true
  nil
end

#aborted?Boolean

Returns True if the upload has been aborted.

See Also:



122
123
124
# File 'lib/aws/s3/multipart_upload.rb', line 122

def aborted?
  @aborted
end

#add_part(data, options = {}) ⇒ Object #add_part(options) ⇒ Object

Uploads a part.

Overloads:

  • #add_part(data, options = {}) ⇒ Object

    Options Hash (options):

    • :content_length (Integer)

      If provided, this option must match the total number of bytes written to S3 during the operation. This option is required if :data is an IO-like object without a size method.

  • #add_part(options) ⇒ Object

    Options Hash (options):

    • :data (Object)

      The data to upload. Valid values include:

      • A string

      • A Pathname object

      • Any object responding to read and eof?; the object must support the following access methods:

        read                     # all at once
        read(length) until eof?  # in chunks
        

        If you specify data this way, you must also include the :content_length option.

    • :file (String)

      Can be specified instead of :data; its value specifies the path of a file to upload.

    • :content_length (Integer)

      If provided, this option must match the total number of bytes written to S3 during the operation. This option is required if :data is an IO-like object without a size method.

    • :part_number (Integer)

      The part number.



183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/aws/s3/multipart_upload.rb', line 183

def add_part(data_or_options, options = {})
  if data_or_options.kind_of?(Hash)
    part_options = base_opts.merge(data_or_options)
  else
    part_options = base_opts.merge(:data => data_or_options)
  end
  part_options.merge!(options)

  unless part_options[:part_number]
    @increment_mutex.synchronize do
      part_options[:part_number] = (@last_part += 1)
    end
  end
  part_number = part_options[:part_number]

  resp = client.upload_part(part_options)
  @completed_mutex.synchronize do
    @completed_parts[part_number] = {
      :part_number => part_number,
      :etag => resp.etag
    }
  end
  UploadedPart.new(self, part_number)
end

#bucketObject



39
40
41
# File 'lib/aws/s3/multipart_upload.rb', line 39

def bucket
  object.bucket
end

#closeS3Object, ObjectVersion

Completes the upload or aborts it if no parts have been uploaded yet. Does nothing if the upload has already been aborted.



259
260
261
262
263
264
265
266
# File 'lib/aws/s3/multipart_upload.rb', line 259

def close
  return if aborted?
  if completed_parts.empty?
    abort
  else
    complete
  end
end

#complete(*parts) ⇒ S3Object, ObjectVersion

Completes the upload by assembling previously uploaded parts.



215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/aws/s3/multipart_upload.rb', line 215

def complete(*parts)
  parts = parts.flatten
  case parts.first
  when :remote_parts
    complete_opts = get_complete_opts
  when :local_parts, nil
    complete_opts = base_opts.merge(:parts => completed_parts)
  else
    part_numbers = parts.map do |part|
      case part
      when Integer
        part
      when UploadedPart
        raise ArgumentError.new("cannot complete an upload with parts "+
                                "from a different upload") unless
          part.upload == self

        part.part_number
      else
        raise ArgumentError.new("expected number or UploadedPart")
      end
    end
    complete_opts = get_complete_opts(part_numbers)
  end

  raise "no parts uploaded" if complete_opts[:parts].empty?

  resp = client.complete_multipart_upload(complete_opts)
  if resp.version_id
    ObjectVersion.new(object, resp.version_id)
  else
    object
  end
end

#exists?Boolean



65
66
67
68
69
70
71
# File 'lib/aws/s3/multipart_upload.rb', line 65

def exists?
  client.list_parts(base_opts)
rescue Errors::NoSuchUpload => e
  false
else
  true
end

#initiatorObject



78
79
80
# File 'lib/aws/s3/multipart_upload.rb', line 78

def initiator
  client.list_parts(base_opts).initiator
end

#ownerObject



84
85
86
# File 'lib/aws/s3/multipart_upload.rb', line 84

def owner
  client.list_parts(base_opts).owner
end

#partsUploadedPartCollection



270
271
272
# File 'lib/aws/s3/multipart_upload.rb', line 270

def parts
  UploadedPartCollection.new(self)
end

#reduced_redundancy?Boolean



99
100
101
# File 'lib/aws/s3/multipart_upload.rb', line 99

def reduced_redundancy?
  storage_class == :reduced_redundancy
end

#storage_classSymbol



93
94
95
# File 'lib/aws/s3/multipart_upload.rb', line 93

def storage_class
  client.list_parts(base_opts).storage_class.downcase.to_sym
end