Class: Uploadcare::Api::Upload

Inherits:
Object
  • Object
show all
Includes:
Internal::ErrorHandler, Internal::ThrottleHandler
Defined in:
lib/uploadcare/api/upload.rb

Overview

Base client for the Uploadcare Upload API.

Provides HTTP methods for upload endpoints using multipart/form-data encoding. Authentication is handled via public key in request parameters (no HMAC signing).

Endpoint classes are accessed via lazy-loaded accessors: upload = Uploadcare::Api::Upload.new(config: config) upload.files.direct(file: file_obj) upload.groups.create(files: ["uuid1", "uuid2"])

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config: Uploadcare.configuration) ⇒ Upload

Initialize a new Upload API client.

Parameters:



36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/uploadcare/api/upload.rb', line 36

def initialize(config: Uploadcare.configuration)
  @config = config
  @memo_mutex = Mutex.new
  @connection = Faraday.new(url: config.upload_api_root) do |conn|
    conn.request :multipart
    conn.request :url_encoded
    conn.response :json, content_type: /\bjson$/
    conn.response :raise_error
    conn.response :logger, config.logger, bodies: false, headers: false if ENV['DEBUG']
    conn.adapter Faraday.default_adapter
  end
end

Instance Attribute Details

#configUploadcare::Configuration (readonly)



28
29
30
# File 'lib/uploadcare/api/upload.rb', line 28

def config
  @config
end

#connectionFaraday::Connection (readonly)

Returns:

  • (Faraday::Connection)


31
32
33
# File 'lib/uploadcare/api/upload.rb', line 31

def connection
  @connection
end

Instance Method Details

#filesUploadcare::Api::Upload::Files

Returns File upload operations.

Returns:



52
53
54
# File 'lib/uploadcare/api/upload.rb', line 52

def files
  memoized(:@files) { Uploadcare::Api::Upload::Files.new(upload: self) }
end

#get(path:, params: {}, headers: {}, request_options: {}) ⇒ Uploadcare::Result

Make a GET request to the Upload API wrapped in a Result.

Parameters:

  • path (String)

    API endpoint path

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

    Query parameters

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

    Additional request headers

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

    Request options

Returns:



70
71
72
73
74
# File 'lib/uploadcare/api/upload.rb', line 70

def get(path:, params: {}, headers: {}, request_options: {})
  Uploadcare::Result.capture do
    make_request(:get, path, params, headers, request_options)
  end
end

#groupsUploadcare::Api::Upload::Groups

Returns Group operations via Upload API.

Returns:



57
58
59
# File 'lib/uploadcare/api/upload.rb', line 57

def groups
  memoized(:@groups) { Uploadcare::Api::Upload::Groups.new(upload: self) }
end

#post(path:, params: {}, headers: {}, request_options: {}) ⇒ Uploadcare::Result

Make a POST request to the Upload API wrapped in a Result.

Parameters:

  • path (String)

    API endpoint path

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

    Request body parameters

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

    Additional request headers

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

    Request options

Returns:



83
84
85
86
87
# File 'lib/uploadcare/api/upload.rb', line 83

def post(path:, params: {}, headers: {}, request_options: {})
  Uploadcare::Result.capture do
    make_request(:post, path, params, headers, request_options)
  end
end

#upload_part_to_url(presigned_url, part_data, max_retries: 3, timeout: nil, open_timeout: nil) ⇒ Boolean

Upload binary data to a presigned URL (for multipart uploads).

Parameters:

  • presigned_url (String)

    Presigned URL from multipart_start

  • part_data (String, IO)

    Binary data for this part

  • max_retries (Integer) (defaults to: 3)

    Maximum retry attempts (default: 3)

  • timeout (Integer, nil) (defaults to: nil)

    Request timeout in seconds

  • open_timeout (Integer, nil) (defaults to: nil)

    Open timeout in seconds

Returns:

  • (Boolean)

    true on success

Raises:



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/uploadcare/api/upload.rb', line 98

def upload_part_to_url(presigned_url, part_data, max_retries: 3, timeout: nil, open_timeout: nil)
  uri = validated_presigned_uri(presigned_url)
  retries = 0
  begin
    conn = Faraday.new(url: "#{uri.scheme}://#{uri.host}") do |f|
      f.adapter Faraday.default_adapter
    end

    data = part_data.respond_to?(:read) ? part_data.read : part_data
    response = upload_part_request(
      conn: conn, request_uri: uri.request_uri, data: data, timeout: timeout, open_timeout: open_timeout
    )
    raise_multipart_upload_error("Failed to upload part: HTTP #{response.status}") unless success_response?(response)

    true
  rescue StandardError => e
    retry_part_upload_or_raise!(error: e, retries: retries, max_retries: max_retries)
    retries += 1
    retry
  end
end