diff --git a/core/src/services/pcloud/core.rs b/core/src/services/pcloud/core.rs index d71d752aeee..21d3dfedd78 100644 --- a/core/src/services/pcloud/core.rs +++ b/core/src/services/pcloud/core.rs @@ -334,14 +334,12 @@ impl PcloudCore { pub async fn upload_file(&self, path: &str, bs: Bytes) -> Result> { let path = build_abs_path(&self.root, path); - let paths: Vec<&str> = path.split('/').collect(); - let name = paths[paths.len() - 1]; - let path = path.replace(&format!("/{}", name), ""); + let (name, path) = (get_basename(&path), get_parent(&path).trim_end_matches('/')); let url = format!( "{}/uploadfile?path=/{}&filename={}&username={}&password={}", self.endpoint, - percent_encode_path(&path), + percent_encode_path(path), percent_encode_path(name), self.username, self.password diff --git a/core/src/services/seafile/writer.rs b/core/src/services/seafile/writer.rs index 0ff6ae91907..0496d5cad9d 100644 --- a/core/src/services/seafile/writer.rs +++ b/core/src/services/seafile/writer.rs @@ -48,16 +48,18 @@ impl SeafileWriter { #[async_trait] impl oio::OneShotWrite for SeafileWriter { async fn write_once(&self, bs: &dyn oio::WriteBuf) -> Result<()> { - let path = build_abs_path(&self.core.root, &self.path); let bs = oio::ChunkedBytes::from_vec(bs.vectored_bytes(bs.remaining())); let upload_url = self.core.get_upload_url().await?; let req = Request::post(upload_url); - let paths = path.split('/').collect::>(); - let filename = paths[paths.len() - 1]; - let relative_path = path.replace(filename, ""); + let (filename, relative_path) = if self.path.ends_with('/') { + ("", build_abs_path(&self.core.root, &self.path)) + } else { + let (filename, relative_path) = (get_basename(&self.path), get_parent(&self.path)); + (filename, build_abs_path(&self.core.root, relative_path)) + }; let file_part = FormDataPart::new("file") .header(