Class: Uploadcare::Operations::MultipartUpload

Inherits:
Object
  • Object
show all
Defined in:
lib/uploadcare/operations/multipart_upload.rb

Overview

Handles the complete multipart upload workflow.

Multipart upload is used for files larger than the multipart threshold (default: 100MB). The process:

  1. Start upload → get UUID and presigned URLs
  2. Upload file parts to presigned URLs (optionally in parallel)
  3. Complete upload → finalize and get file info

Examples:

mp = Uploadcare::Operations::MultipartUpload.new(upload_client: upload, config: config)
result = mp.upload(file: large_file, store: true, threads: 4)

Constant Summary collapse

CHUNK_SIZE =

5MB default chunk size

5_242_880

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(upload_client:, config:) ⇒ MultipartUpload

Returns a new instance of MultipartUpload.

Parameters:



27
28
29
30
# File 'lib/uploadcare/operations/multipart_upload.rb', line 27

def initialize(upload_client:, config:)
  @upload_client = upload_client
  @config = config
end

Instance Attribute Details

#configUploadcare::Configuration (readonly)

Returns Configuration.

Returns:



23
24
25
# File 'lib/uploadcare/operations/multipart_upload.rb', line 23

def config
  @config
end

#upload_clientUploadcare::Api::Upload (readonly)

Returns Upload API client.

Returns:



20
21
22
# File 'lib/uploadcare/operations/multipart_upload.rb', line 20

def upload_client
  @upload_client
end

Instance Method Details

#upload(file:, request_options: {}, **options) {|Hash| ... } ⇒ Uploadcare::Result

Execute the full multipart upload flow.

Parameters:

  • file (File, IO)

    File to upload

  • options (Hash)

    Upload options (:store, :metadata, :threads, :part_size)

  • request_options (Hash) (defaults to: {})

    Request options

Yields:

  • (Hash)

    Progress callback with :uploaded, :total, :part, :total_parts

Returns:



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/uploadcare/operations/multipart_upload.rb', line 39

def upload(file:, request_options: {}, **options, &block)
  Uploadcare::Result.capture do
    prepared_file = Uploadcare::Internal::UploadIo.wrap(file)
    file_size = prepared_file.size
    filename = prepared_file.original_filename
    content_type = MIME::Types.type_for(prepared_file.path).first&.content_type || 'application/octet-stream'
    part_size, threads = normalize_upload_options(options)

    start_response = Uploadcare::Result.unwrap(
      upload_client.files.multipart_start(
        filename: filename,
        size: file_size,
        content_type: content_type,
        request_options: request_options,
        **options
      )
    )

    uuid = start_response['uuid']
    presigned_urls = start_response['parts']

    if threads > 1
      upload_parts_parallel(prepared_file, presigned_urls, part_size, threads, &block)
    else
      upload_parts_sequential(prepared_file, presigned_urls, part_size, &block)
    end

    Uploadcare::Result.unwrap(
      upload_client.files.multipart_complete(uuid: uuid, request_options: request_options)
    )

    { 'uuid' => uuid }
  ensure
    prepared_file&.close!
  end
end