diff --git a/spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/S3Resource.java b/spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/S3Resource.java index 007e59e90..3a7619319 100644 --- a/spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/S3Resource.java +++ b/spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/S3Resource.java @@ -23,6 +23,9 @@ import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.Instant; +import java.util.ArrayList; +import java.util.List; + import org.springframework.core.io.AbstractResource; import org.springframework.core.io.WritableResource; import org.springframework.lang.Nullable; @@ -76,7 +79,11 @@ public S3Resource(Location location, S3Client s3Client, S3OutputStreamProvider s @Override public URL getURL() throws IOException { - String encodedObjectName = URLEncoder.encode(location.getObject(), StandardCharsets.UTF_8.toString()); + List splits = new ArrayList<>(); + for (String split : location.getObject().split("/")) { + splits.add(URLEncoder.encode(split, StandardCharsets.UTF_8.toString())); + } + String encodedObjectName = String.join("/", splits); return new URL("https", location.getBucket() + ".s3.amazonaws.com", "/" + encodedObjectName); } diff --git a/spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/S3ResourceIntegrationTests.java b/spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/S3ResourceIntegrationTests.java index c3629d25a..354d0c1e2 100644 --- a/spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/S3ResourceIntegrationTests.java +++ b/spring-cloud-aws-s3-parent/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/S3ResourceIntegrationTests.java @@ -129,9 +129,9 @@ void returnsResourceUrl() throws IOException { void returnsEncodedResourceUrlAndUri() throws IOException, URISyntaxException { S3Resource resource = s3Resource("s3://first-bucket/some/[objectName]"); assertThat(resource.getURL().toString()) - .isEqualTo("https://first-bucket.s3.amazonaws.com/some%2F%5BobjectName%5D"); + .isEqualTo("https://first-bucket.s3.amazonaws.com/some/%5BobjectName%5D"); assertThat(resource.getURI()) - .isEqualTo(new URI("https://first-bucket.s3.amazonaws.com/some%2F%5BobjectName%5D")); + .isEqualTo(new URI("https://first-bucket.s3.amazonaws.com/some/%5BobjectName%5D")); } @Test