def upload(self, files, metadata=None, headers=None, access_key=None, secret_key=None, queue_derive=None, verbose=None, verify=None, checksum=None, delete=None, retries=None, retries_sleep=None, debug=None, request_kwargs=None): """Upload files to an item. The item will be created if it does not exist. :type files: list :param files: The filepaths or file-like objects to upload. :type kwargs: dict :param kwargs: The keyword arguments from the call to upload_file(). Usage:: >>> import internetarchive >>> item = internetarchive.Item('identifier') >>> md = dict(mediatype='image', creator='Jake Johnson') >>> item.upload('/path/to/image.jpg', metadata=md, queue_derive=False) True :rtype: list :returns: A list of requests.Response objects. """ queue_derive = True if queue_derive is None else queue_derive remote_dir_name = None if isinstance(files, dict): files = list(files.items()) if not isinstance(files, (list, tuple)): files = [files] responses = [] file_index = 0 if checksum: total_files = recursive_file_count(files, item=self, checksum=True) else: total_files = recursive_file_count(files, item=self, checksum=False) for f in files: if (isinstance(f, string_types) and is_dir(f)) \ or (isinstance(f, tuple) and is_dir(f[-1])): if isinstance(f, tuple): remote_dir_name = f[0].strip('/') f = f[-1] for filepath, key in iter_directory(f): file_index += 1 # Set derive header if queue_derive is True, # and this is the last request being made. if queue_derive is True and file_index >= total_files: _queue_derive = True else: _queue_derive = False if not f.endswith('/'): if remote_dir_name: key = '{0}{1}/{2}'.format(remote_dir_name, f, key) else: key = '{0}/{1}'.format(f, key) elif remote_dir_name: key = '{0}/{1}'.format(remote_dir_name, key) key = norm_filepath(key) resp = self.upload_file(filepath, key=key, metadata=metadata, headers=headers, access_key=access_key, secret_key=secret_key, queue_derive=_queue_derive, verbose=verbose, verify=verify, checksum=checksum, delete=delete, retries=retries, retries_sleep=retries_sleep, debug=debug, request_kwargs=request_kwargs) responses.append(resp) else: file_index += 1 # Set derive header if queue_derive is True, # and this is the last request being made. # if queue_derive is True and file_index >= len(files): if queue_derive is True and file_index >= total_files: _queue_derive = True else: _queue_derive = False if not isinstance(f, (list, tuple)): key, body = (None, f) else: key, body = f if key and not isinstance(key, string_types): key = str(key) resp = self.upload_file(body, key=key, metadata=metadata, headers=headers, access_key=access_key, secret_key=secret_key, queue_derive=_queue_derive, verbose=verbose, verify=verify, checksum=checksum, delete=delete, retries=retries, retries_sleep=retries_sleep, debug=debug, request_kwargs=request_kwargs) responses.append(resp) return responses
def upload(self, files, metadata=None, headers=None, access_key=None, secret_key=None, queue_derive=None, verbose=None, verify=None, checksum=None, delete=None, retries=None, retries_sleep=None, debug=None, request_kwargs=None): """Upload files to an item. The item will be created if it does not exist. :type files: str, file, list, tuple, dict :param files: The filepaths or file-like objects to upload. :param \*\*kwargs: Optional arguments that :func:`Item.upload_file()` takes. Usage:: >>> import internetarchive >>> item = internetarchive.Item('identifier') >>> md = dict(mediatype='image', creator='Jake Johnson') >>> item.upload('/path/to/image.jpg', metadata=md, queue_derive=False) [<Response [200]>] Uploading multiple files:: >>> r = item.upload(['file1.txt', 'file2.txt']) >>> r = item.upload([fileobj, fileobj2]) >>> r = item.upload(('file1.txt', 'file2.txt')) Uploading file objects: >>> import io >>> f = io.BytesIO(b"some initial binary data: \\x00\\x01") >>> r = item.upload({'remote-name.txt': f}) >>> f = io.BytesIO(b"some more binary data: \\x00\\x01") >>> f.name = 'remote-name.txt' >>> r = item.upload(f) *Note: file objects must either have a name attribute, or be uploaded in a dict where the key is the remote-name* Setting the remote filename with a dict:: >>> r = item.upload({'remote-name.txt': '/path/to/local/file.txt'}) :rtype: list :returns: A list of :class:`requests.Response` objects. """ queue_derive = True if queue_derive is None else queue_derive remote_dir_name = None if isinstance(files, dict): files = list(files.items()) if not isinstance(files, (list, tuple)): files = [files] responses = [] file_index = 0 if checksum: total_files = recursive_file_count(files, item=self, checksum=True) else: total_files = recursive_file_count(files, item=self, checksum=False) for f in files: if (isinstance(f, string_types) and is_dir(f)) \ or (isinstance(f, tuple) and is_dir(f[-1])): if isinstance(f, tuple): remote_dir_name = f[0].strip('/') f = f[-1] for filepath, key in iter_directory(f): file_index += 1 # Set derive header if queue_derive is True, # and this is the last request being made. if queue_derive is True and file_index >= total_files: _queue_derive = True else: _queue_derive = False if not f.endswith('/'): if remote_dir_name: key = '{0}{1}/{2}'.format(remote_dir_name, f, key) else: key = '{0}/{1}'.format(f, key) elif remote_dir_name: key = '{0}/{1}'.format(remote_dir_name, key) key = norm_filepath(key) resp = self.upload_file(filepath, key=key, metadata=metadata, headers=headers, access_key=access_key, secret_key=secret_key, queue_derive=_queue_derive, verbose=verbose, verify=verify, checksum=checksum, delete=delete, retries=retries, retries_sleep=retries_sleep, debug=debug, request_kwargs=request_kwargs) responses.append(resp) else: file_index += 1 # Set derive header if queue_derive is True, # and this is the last request being made. # if queue_derive is True and file_index >= len(files): if queue_derive is True and file_index >= total_files: _queue_derive = True else: _queue_derive = False if not isinstance(f, (list, tuple)): key, body = (None, f) else: key, body = f if key and not isinstance(key, string_types): key = str(key) resp = self.upload_file(body, key=key, metadata=metadata, headers=headers, access_key=access_key, secret_key=secret_key, queue_derive=_queue_derive, verbose=verbose, verify=verify, checksum=checksum, delete=delete, retries=retries, retries_sleep=retries_sleep, debug=debug, request_kwargs=request_kwargs) responses.append(resp) return responses
def upload( self, files, metadata: Mapping | None = None, headers: dict | None = None, access_key: str | None = None, secret_key: str | None = None, queue_derive=None, # TODO: True if None?? verbose: bool = False, verify: bool = False, checksum: bool = False, delete: bool = False, retries: int | None = None, retries_sleep: int | None = None, debug: bool = False, validate_identifier: bool = False, request_kwargs: dict | None = None) -> list[Request | Response]: r"""Upload files to an item. The item will be created if it does not exist. :type files: str, file, list, tuple, dict :param files: The filepaths or file-like objects to upload. :param \*\*kwargs: Optional arguments that :func:`Item.upload_file()` takes. :returns: A list of :class:`requests.Response` objects. Usage:: >>> import internetarchive >>> item = internetarchive.Item('identifier') >>> md = {'mediatype': 'image', 'creator': 'Jake Johnson'} >>> item.upload('/path/to/image.jpg', metadata=md, queue_derive=False) [<Response [200]>] Uploading multiple files:: >>> r = item.upload(['file1.txt', 'file2.txt']) >>> r = item.upload([fileobj, fileobj2]) >>> r = item.upload(('file1.txt', 'file2.txt')) Uploading file objects: >>> import io >>> f = io.BytesIO(b'some initial binary data: \x00\x01') >>> r = item.upload({'remote-name.txt': f}) >>> f = io.BytesIO(b'some more binary data: \x00\x01') >>> f.name = 'remote-name.txt' >>> r = item.upload(f) *Note: file objects must either have a name attribute, or be uploaded in a dict where the key is the remote-name* Setting the remote filename with a dict:: >>> r = item.upload({'remote-name.txt': '/path/to/local/file.txt'}) """ queue_derive = True if queue_derive is None else queue_derive remote_dir_name = None total_files = 0 if isinstance(files, dict): if files.get('name'): files = [files] total_files = 1 else: files = list(files.items()) if not isinstance(files, (list, tuple)): files = [files] if all(isinstance(f, dict) and f.get('name') for f in files): total_files = len(files) responses = [] file_index = 0 if queue_derive and total_files is None: if checksum: total_files = recursive_file_count(files, item=self, checksum=True) else: total_files = recursive_file_count(files, item=self, checksum=False) file_metadata = None for f in files: if isinstance(f, dict): if f.get('name'): file_metadata = f.copy() del file_metadata['name'] f = f['name'] if ((isinstance(f, str) and is_dir(f)) or (isinstance(f, tuple) and is_dir(f[-1]))): if isinstance(f, tuple): remote_dir_name = f[0].strip('/') f = f[-1] for filepath, key in iter_directory(f): file_index += 1 # Set derive header if queue_derive is True, # and this is the last request being made. if queue_derive is True and file_index >= total_files: _queue_derive = True else: _queue_derive = False if not f.endswith('/'): if remote_dir_name: key = f'{remote_dir_name}{f}/{key}' else: key = f'{f}/{key}' elif remote_dir_name: key = f'{remote_dir_name}/{key}' key = norm_filepath(key) resp = self.upload_file( filepath, key=key, metadata=metadata, file_metadata=file_metadata, headers=headers, access_key=access_key, secret_key=secret_key, queue_derive=_queue_derive, verbose=verbose, verify=verify, checksum=checksum, delete=delete, retries=retries, retries_sleep=retries_sleep, debug=debug, validate_identifier=validate_identifier, request_kwargs=request_kwargs) responses.append(resp) else: file_index += 1 # Set derive header if queue_derive is True, # and this is the last request being made. # if queue_derive is True and file_index >= len(files): if queue_derive is True and file_index >= total_files: _queue_derive = True else: _queue_derive = False if not isinstance(f, (list, tuple)): key, body = (None, f) else: key, body = f if key and not isinstance(key, str): key = str(key) resp = self.upload_file( body, key=key, metadata=metadata, file_metadata=file_metadata, headers=headers, access_key=access_key, secret_key=secret_key, queue_derive=_queue_derive, verbose=verbose, verify=verify, checksum=checksum, delete=delete, retries=retries, retries_sleep=retries_sleep, debug=debug, validate_identifier=validate_identifier, request_kwargs=request_kwargs) responses.append(resp) return responses