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:
         """