lib/filestack/utils/multipart_upload_utils.rb in filestack-2.5.3 vs lib/filestack/utils/multipart_upload_utils.rb in filestack-2.5.4
- old
+ new
@@ -21,10 +21,20 @@
mimetype = 'application/octet-stream'
end
[filename, filesize, mimetype.to_s]
end
+ def multipart_options(options)
+ [:region, :container, :path, :access].each do |key|
+ if options.has_key?(key)
+ options[:"store_#{key}"] = options[key]
+ options.delete(key)
+ end
+ end
+ return options
+ end
+
# Send start response to multipart endpoint
#
# @param [String] apikey Filestack API key
# @param [String] filename Name of incoming file
# @param [Int] filesize Size of incoming file
@@ -33,21 +43,21 @@
# policy/signature
# @param [Hash] options User-defined options for
# multipart uploads
#
# @return [Typhoeus::Response]
- def multipart_start(apikey, filename, filesize, mimetype, security, options)
+ def multipart_start(apikey, filename, filesize, mimetype, security, storage, options = {})
params = {
apikey: apikey,
filename: filename,
mimetype: mimetype,
size: filesize,
- store_location: options.nil? ? 's3' : options[:store_location],
+ store_location: storage,
file: Tempfile.new(filename),
- options: options,
'multipart' => 'true'
}
+ options = multipart_options(options)
params = params.merge!(options) if options
unless security.nil?
params[:policy] = security.policy
params[:signature] = security.signature
@@ -74,11 +84,11 @@
# multipart_start
# @param [Hash] options User-defined options for
# multipart uploads
#
# @return [Array]
- def create_upload_jobs(apikey, filename, filepath, filesize, start_response, options)
+ def create_upload_jobs(apikey, filename, filepath, filesize, start_response, storage, options)
jobs = []
part = 1
seek_point = 0
while seek_point < filesize
part_info = {
@@ -91,13 +101,15 @@
uri: start_response['uri'],
region: start_response['region'],
upload_id: start_response['upload_id'],
location_url: start_response['location_url'],
start_response: start_response,
- options: options,
- store_location: options.nil? ? 's3' : options[:store_location]
+ store_location: storage
}
+ options = multipart_options(options)
+ part_info = part_info.merge!(options) if options
+
if seek_point + FilestackConfig::DEFAULT_CHUNK_SIZE > filesize
size = filesize - (seek_point)
else
size = FilestackConfig::DEFAULT_CHUNK_SIZE
end
@@ -189,22 +201,22 @@
# part numbers
# @param [Hash] options User-defined options for
# multipart uploads
#
# @return [Typhoeus::Response]
- def multipart_complete(apikey, filename, filesize, mimetype, start_response, parts_and_etags, options, intelligent = false)
+ def multipart_complete(apikey, filename, filesize, mimetype, start_response, parts_and_etags, options, storage, intelligent = false)
if !intelligent
data = {
apikey: apikey,
uri: start_response['uri'],
region: start_response['region'],
upload_id: start_response['upload_id'],
filename: filename,
size: filesize,
mimetype: mimetype,
parts: parts_and_etags.join(';'),
- store_location: options.nil? ? 's3' : options[:store_location],
+ store_location: storage,
file: Tempfile.new(filename)
}
else
data = {
apikey: apikey,
@@ -212,15 +224,16 @@
region: start_response['region'],
upload_id: start_response['upload_id'],
filename: filename,
size: filesize,
mimetype: mimetype,
- store_location: options.nil? ? 's3' : options[:store_location],
+ store_location: storage,
file: Tempfile.new(filename),
'multipart' => 'true'
}
end
+ options = multipart_options(options)
data = data.merge!(options) if options
Typhoeus.post(
FilestackConfig::MULTIPART_COMPLETE_URL, body: data,
headers: FilestackConfig::HEADERS
@@ -235,40 +248,43 @@
# policy/signature
# @param [Hash] options User-defined options for
# multipart uploads
#
# @return [Hash]
- def multipart_upload(apikey, filepath, security, options, timeout, intelligent: false)
+ def multipart_upload(apikey, filepath, security, options, timeout, storage, intelligent: false)
filename, filesize, mimetype = get_file_info(filepath)
start_response = multipart_start(
- apikey, filename, filesize, mimetype, security, options
+ apikey, filename, filesize, mimetype, security, storage, options
)
+
unless start_response['upload_type'].nil?
intelligent_enabled = ((start_response['upload_type'].include? 'intelligent_ingestion')) && intelligent
end
+
jobs = create_upload_jobs(
- apikey, filename, filepath, filesize, start_response, options
+ apikey, filename, filepath, filesize, start_response, storage, options
)
+
if intelligent_enabled
state = IntelligentState.new
run_intelligent_upload_flow(jobs, state)
response_complete = multipart_complete(
apikey, filename, filesize, mimetype,
- start_response, nil, options, intelligent
+ start_response, nil, options, storage, intelligent
)
else
parts_and_etags = run_uploads(jobs, apikey, filepath, options)
response_complete = multipart_complete(
apikey, filename, filesize, mimetype,
- start_response, parts_and_etags, options
+ start_response, parts_and_etags, options, storage
)
end
begin
Timeout::timeout(timeout) {
while response_complete.code == 202
response_complete = multipart_complete(
apikey, filename, filesize, mimetype,
- start_response, nil, options, intelligent
+ start_response, nil, options, storage, intelligent
)
end
}
rescue
raise "Upload timed out upon completion. Please try again later"