Class: Uploadcare::Operations::UploadRouter

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

Overview

Routes upload requests to the appropriate Upload API endpoint.

Handles the decision logic for choosing between:

  • Direct upload (small files < multipart threshold)
  • Multipart upload (large files >= multipart threshold)
  • URL upload (string URLs)
  • Batch upload (arrays of files)

Examples:

router = Uploadcare::Operations::UploadRouter.new(client: client)
file = router.upload(File.open("image.jpg"))
file = router.upload("https://example.com/image.jpg")
files = router.upload([file1, file2])

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client:) ⇒ UploadRouter

Returns a new instance of UploadRouter.

Parameters:



21
22
23
# File 'lib/uploadcare/operations/upload_router.rb', line 21

def initialize(client:)
  @client = client
end

Instance Attribute Details

#clientUploadcare::Client (readonly)

Returns Client instance.

Returns:



18
19
20
# File 'lib/uploadcare/operations/upload_router.rb', line 18

def client
  @client
end

Instance Method Details

#file_info(file_id:, request_options: {}) ⇒ Hash

Get file info from Upload API (without secret key).

Parameters:

  • file_id (String)

    File UUID

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

    Request options

Returns:

  • (Hash)

    File information



130
131
132
133
134
# File 'lib/uploadcare/operations/upload_router.rb', line 130

def file_info(file_id:, request_options: {})
  Uploadcare::Result.unwrap(
    client.api.upload.files.info(file_id: file_id, request_options: request_options)
  )
end

#multipart_upload(file:, request_options: {}, **options, &block) ⇒ Uploadcare::Resources::File

Upload a large file using multipart upload.

Parameters:

  • file (File, IO)

    Large file to upload

  • options (Hash)

    Upload options

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

    Request options

Returns:



102
103
104
105
106
107
108
109
110
111
112
# File 'lib/uploadcare/operations/upload_router.rb', line 102

def multipart_upload(file:, request_options: {}, **options, &block)
  response = Uploadcare::Result.unwrap(
    Uploadcare::Operations::MultipartUpload.new(
      upload_client: client.api.upload,
      config: client.config
    ).upload(file: file, request_options: request_options, **options, &block)
  )
  return response unless response.is_a?(Hash) && response['uuid']

  Uploadcare::Resources::File.new(response, client)
end

#upload(source, request_options: {}, **options, &block) ⇒ Uploadcare::Resources::File, ...

Upload a file, URL, or array of files.

Automatically routes to the appropriate upload method based on the source type:

  • File/IO objects >= multipart threshold → multipart upload
  • File/IO objects < multipart threshold → direct upload
  • Arrays → batch direct upload
  • Strings → URL upload

Parameters:

  • source (File, IO, String, Array)

    Upload source

  • options (Hash)

    Upload options (:store, :metadata, etc.)

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

    Request options

Returns:

Raises:

  • (ArgumentError)

    if source type is not recognized



38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/uploadcare/operations/upload_router.rb', line 38

def upload(source, request_options: {}, **options, &block)
  if big_file?(source)
    multipart_upload(file: source, request_options: request_options, **options, &block)
  elsif file?(source)
    upload_file(file: source, request_options: request_options, **options)
  elsif source.is_a?(Array)
    upload_files(files: source, request_options: request_options, **options)
  elsif source.is_a?(String)
    upload_from_url(url: source, request_options: request_options, **options)
  else
    raise ArgumentError, "Expected input to be a File/Array/URL, given: `#{source}`"
  end
end

#upload_file(file:, request_options: {}, **options) ⇒ Uploadcare::Resources::File

Upload a single file directly.

Parameters:

  • file (File, IO)

    File to upload

  • options (Hash)

    Upload options

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

    Request options

Returns:



58
59
60
61
62
63
64
# File 'lib/uploadcare/operations/upload_router.rb', line 58

def upload_file(file:, request_options: {}, **options)
  response = Uploadcare::Result.unwrap(
    client.api.upload.files.direct_many(files: [file], request_options: request_options, **options)
  )
  file_name, uuid = response.first
  Uploadcare::Resources::File.new({ uuid: uuid, original_filename: decode_uploaded_filename(file_name) }, client)
end

#upload_files(files:, request_options: {}, **options) ⇒ Array<Uploadcare::Resources::File>

Upload multiple files directly.

Parameters:

  • files (Array<File, IO>)

    Files to upload

  • options (Hash)

    Upload options

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

    Request options

Returns:



72
73
74
75
76
77
78
79
# File 'lib/uploadcare/operations/upload_router.rb', line 72

def upload_files(files:, request_options: {}, **options)
  response = Uploadcare::Result.unwrap(
    client.api.upload.files.direct_many(files: files, request_options: request_options, **options)
  )
  response.map do |file_name, uuid|
    Uploadcare::Resources::File.new({ uuid: uuid, original_filename: decode_uploaded_filename(file_name) }, client)
  end
end

#upload_from_url(url:, request_options: {}, **options) ⇒ Uploadcare::Resources::File, Hash

Upload a file from URL.

Parameters:

  • url (String)

    Source URL

  • options (Hash)

    Upload options (:async, :store, :metadata)

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

    Request options

Returns:



87
88
89
90
91
92
93
94
# File 'lib/uploadcare/operations/upload_router.rb', line 87

def upload_from_url(url:, request_options: {}, **options)
  response = Uploadcare::Result.unwrap(
    client.api.upload.files.from_url(source_url: url, request_options: request_options, **options)
  )
  return response if options[:async]

  Uploadcare::Resources::File.new(response, client)
end

#upload_from_url_status(token:, request_options: {}) ⇒ Hash

Get upload-from-URL status.

Parameters:

  • token (String)

    Upload token

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

    Request options

Returns:

  • (Hash)

    Status response



119
120
121
122
123
# File 'lib/uploadcare/operations/upload_router.rb', line 119

def upload_from_url_status(token:, request_options: {})
  Uploadcare::Result.unwrap(
    client.api.upload.files.from_url_status(token: token, request_options: request_options)
  )
end