diff --git a/src/coscine/resource.py b/src/coscine/resource.py index a5bcfb63c43669f09e97917c8cb9973963e36349..7ce6fcb9820bf8aedb146e54652fd02f78babc6e 100644 --- a/src/coscine/resource.py +++ b/src/coscine/resource.py @@ -665,7 +665,8 @@ class Resource: self, path: str, handle: BinaryIO, - progress: Callable[[int], None] | None = None + progress: Callable[[int], None] | None = None, + use_put: bool = False ): """ Uploads a file-like object to a resource in Coscine. @@ -705,7 +706,10 @@ class Resource: progress_callback(progress_bar, mon.bytes_read, progress) ) headers = {"Content-Type": monitor.content_type} - self.client.post(uri, data=monitor, headers=headers) + if use_put: + self.client.put(uri, data=monitor, headers=headers) + else: + self.client.post(uri, data=monitor, headers=headers) def _upload_blob_s3(self, path: str, handle: BinaryIO) -> None: """ @@ -1201,27 +1205,11 @@ class FileObject: handle = handle.encode("utf-8") if isinstance(handle, bytes): handle = BytesIO(handle) - uri = self.client.uri( - "projects", self.resource.project.id, - "resources", self.resource.id, - "blobs", self.path - ) - files = { - "file": (self.path, handle, "application/octect-stream") - } - encoder = MultipartEncoder(fields=files) - progress_bar = tqdm( - desc=self.path, total=encoder.len, - unit="B", unit_scale=True, ascii=True, - disable=not self.client.verbose - ) - monitor = MultipartEncoderMonitor( - encoder, - lambda mon: - progress_callback(progress_bar, mon.bytes_read, progress) - ) - headers = {"Content-Type": monitor.content_type} - self.client.put(uri, data=monitor, headers=headers) + + if self.type.general_type == "rdss3" and self.client.native: + self.resource._upload_blob_s3(self.path, handle, progress) + else: + self.resource._upload_blob(self.path, handle, progress, use_put = True) def update_metadata(self, metadata: MetadataForm | dict | rdflib.Graph) -> None: """