class S3StreamingMultipartUploader::Uploader

Public Class Methods

new(s3_client, bucket, key, enumerator, min_part_size) click to toggle source
# File lib/s3_streaming_multipart_uploader.rb, line 18
def initialize(s3_client, bucket, key, enumerator, min_part_size)
  @s3_client = s3_client
  @bucket = bucket
  @key = key
  @enumerator = enumerator
  @min_part_size = min_part_size
end

Public Instance Methods

stream() click to toggle source
# File lib/s3_streaming_multipart_uploader.rb, line 26
def stream
  upload_id = start.upload_id
  begin
    parts = stream_parts(upload_id)
    complete(upload_id, parts)
  rescue Aws::Errors::ServiceError => e
    abort(upload_id)
  end
end

Private Instance Methods

abort(upload_id) click to toggle source
# File lib/s3_streaming_multipart_uploader.rb, line 83
def abort(upload_id)
  @s3_client.abort_multipart_upload(
    options.merge(
      upload_id: upload_id
    )
  )
end
complete(upload_id, request_parts) click to toggle source
# File lib/s3_streaming_multipart_uploader.rb, line 74
def complete(upload_id, request_parts)
  @s3_client.complete_multipart_upload(
    options.merge(
      upload_id: upload_id,
      multipart_upload: {parts: request_parts}
    )
  )
end
options() click to toggle source
# File lib/s3_streaming_multipart_uploader.rb, line 48
def options
  {bucket: @bucket, key: @key}
end
read() click to toggle source
# File lib/s3_streaming_multipart_uploader.rb, line 38
def read
  buffer = ""
  begin
    while (chunck = @enumerator.next) && buffer << chunck && buffer.size <= @min_part_size
    end
  rescue StopIteration
  end
  buffer
end
start() click to toggle source
# File lib/s3_streaming_multipart_uploader.rb, line 52
def start
  @s3_client.create_multipart_upload(options)
end
stream_parts(upload_id) click to toggle source
# File lib/s3_streaming_multipart_uploader.rb, line 56
def stream_parts(upload_id)
  i = 1
  parts = []
  while (chunck = read).size > 0
    parts << @s3_client.upload_part(
      options.merge(
        body: chunck,
        upload_id: upload_id,
        part_number: i
      )
    )
    i += 1
  end
  parts.each_with_index.map do |part, i|
    {etag: part.etag, part_number: i + 1}
  end
end