def upload_large(file, **options): """ Upload large files. """ if utils.is_remote_url(file): return upload(file, **options) if hasattr(file, 'read') and callable(file.read): file_io = file else: file_io = open(file, 'rb') upload_result = None with file_io: upload_id = utils.random_public_id() current_loc = 0 chunk_size = options.get("chunk_size", UPLOAD_LARGE_CHUNK_SIZE) file_size = utils.file_io_size(file_io) file_name = options.get( "filename", file_io.name if hasattr(file_io, 'name') and isinstance(file_io.name, str) else "stream") chunk = file_io.read(chunk_size) while chunk: content_range = "bytes {0}-{1}/{2}".format( current_loc, current_loc + len(chunk) - 1, file_size) current_loc += len(chunk) http_headers = { "Content-Range": content_range, "X-Unique-Upload-Id": upload_id } upload_result = upload_large_part((file_name, chunk), http_headers=http_headers, **options) options["public_id"] = upload_result.get("public_id") chunk = file_io.read(chunk_size) return upload_result
def upload_large(file, **options): """ Upload large files. """ if utils.is_remote_url(file): return upload(file, **options) if hasattr(file, 'read') and callable(file.read): file_io = file else: file_io = open(file, 'rb') upload_result = None with file_io: upload_id = utils.random_public_id() current_loc = 0 chunk_size = options.get("chunk_size", UPLOAD_LARGE_CHUNK_SIZE) file_size = utils.file_io_size(file_io) file_name = options.get( "filename", file_io.name if hasattr(file_io, 'name') and isinstance(file_io.name, str) else "stream") chunk = file_io.read(chunk_size) while chunk: content_range = "bytes {0}-{1}/{2}".format(current_loc, current_loc + len(chunk) - 1, file_size) current_loc += len(chunk) http_headers = {"Content-Range": content_range, "X-Unique-Upload-Id": upload_id} upload_result = upload_large_part((file_name, chunk), http_headers=http_headers, **options) options["public_id"] = upload_result.get("public_id") chunk = file_io.read(chunk_size) return upload_result
def call_api(action, params, http_headers=None, return_error=False, unsigned=False, file=None, timeout=None, **options): if http_headers is None: http_headers = {} file_io = None try: if unsigned: params = utils.cleanup_params(params) else: params = utils.sign_request(params, options) param_list = OrderedDict() for k, v in params.items(): if isinstance(v, list): for i in range(len(v)): param_list["{0}[{1}]".format(k, i)] = v[i] elif v: param_list[k] = v api_url = utils.cloudinary_api_url(action, **options) if file: if isinstance(file, string_types): if utils.is_remote_url(file): # URL name = None data = file else: # file path name = file with open(file, "rb") as opened: data = opened.read() elif hasattr(file, 'read') and callable(file.read): # stream data = file.read() name = file.name if hasattr(file, 'name') and isinstance( file.name, str) else "stream" elif isinstance(file, tuple): name = None data = file else: # Not a string, not a stream name = "file" data = file param_list["file"] = (name, data) if name else data headers = {"User-Agent": cloudinary.get_user_agent()} headers.update(http_headers) kw = {} if timeout is not None: kw['timeout'] = timeout code = 200 try: response = _http.request("POST", api_url, param_list, headers, **kw) except HTTPError as e: raise Error("Unexpected error - {0!r}".format(e)) except socket.error as e: raise Error("Socket error: {0!r}".format(e)) try: result = json.loads(response.data.decode('utf-8')) except Exception as e: # Error is parsing json raise Error("Error parsing server response (%d) - %s. Got - %s", response.status, response, e) if "error" in result: if response.status not in [200, 400, 401, 403, 404, 500]: code = response.status if return_error: result["error"]["http_code"] = code else: raise Error(result["error"]["message"]) return result finally: if file_io: file_io.close()
def call_api(action, params, http_headers=None, return_error=False, unsigned=False, file=None, timeout=None, **options): params = utils.cleanup_params(params) headers = {"User-Agent": cloudinary.get_user_agent()} if http_headers is not None: headers.update(http_headers) oauth_token = options.get("oauth_token", cloudinary.config().oauth_token) if oauth_token: headers["authorization"] = "Bearer {}".format(oauth_token) elif not unsigned: params = utils.sign_request(params, options) param_list = [] for k, v in params.items(): if isinstance(v, list): for i in v: param_list.append(("{0}[]".format(k), i)) elif v: param_list.append((k, v)) api_url = utils.cloudinary_api_url(action, **options) if file: filename = options.get( "filename" ) # Custom filename provided by user (relevant only for streams and files) if isinstance(file, string_types): if utils.is_remote_url(file): # URL name = None data = file else: # file path name = filename or file with open(file, "rb") as opened: data = opened.read() elif hasattr(file, 'read') and callable(file.read): # stream data = file.read() name = filename or (file.name if hasattr(file, 'name') and isinstance(file.name, str) else "stream") elif isinstance(file, tuple): name, data = file else: # Not a string, not a stream name = filename or "file" data = file param_list.append(("file", (name, data) if name else data)) kw = {} if timeout is not None: kw['timeout'] = timeout code = 200 try: response = _http.request("POST", api_url, param_list, headers, **kw) except HTTPError as e: raise Error("Unexpected error - {0!r}".format(e)) except socket.error as e: raise Error("Socket error: {0!r}".format(e)) try: result = json.loads(response.data.decode('utf-8')) except Exception as e: # Error is parsing json raise Error("Error parsing server response (%d) - %s. Got - %s" % (response.status, response.data, e)) if "error" in result: if response.status not in [200, 400, 401, 403, 404, 500]: code = response.status if return_error: result["error"]["http_code"] = code else: raise Error(result["error"]["message"]) return result
def call_api(action, params, http_headers=None, return_error=False, unsigned=False, file=None, timeout=None, **options): if http_headers is None: http_headers = {} file_io = None try: if unsigned: params = utils.cleanup_params(params) else: params = utils.sign_request(params, options) param_list = OrderedDict() for k, v in params.items(): if isinstance(v, list): for i in range(len(v)): param_list["{0}[{1}]".format(k, i)] = v[i] elif v: param_list[k] = v api_url = utils.cloudinary_api_url(action, **options) if file: filename = options.get("filename") # Custom filename provided by user (relevant only for streams and files) if isinstance(file, string_types): if utils.is_remote_url(file): # URL name = None data = file else: # file path name = filename or file with open(file, "rb") as opened: data = opened.read() elif hasattr(file, 'read') and callable(file.read): # stream data = file.read() name = filename or (file.name if hasattr(file, 'name') and isinstance(file.name, str) else "stream") elif isinstance(file, tuple): name, data = file else: # Not a string, not a stream name = filename or "file" data = file param_list["file"] = (name, data) if name else data headers = {"User-Agent": cloudinary.get_user_agent()} headers.update(http_headers) kw = {} if timeout is not None: kw['timeout'] = timeout code = 200 try: response = _http.request("POST", api_url, param_list, headers, **kw) except HTTPError as e: raise Error("Unexpected error - {0!r}".format(e)) except socket.error as e: raise Error("Socket error: {0!r}".format(e)) try: result = json.loads(response.data.decode('utf-8')) except Exception as e: # Error is parsing json raise Error("Error parsing server response (%d) - %s. Got - %s" % (response.status, response.data, e)) if "error" in result: if response.status not in [200, 400, 401, 403, 404, 500]: code = response.status if return_error: result["error"]["http_code"] = code else: raise Error(result["error"]["message"]) return result finally: if file_io: file_io.close()