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"