diff --git a/spring-cloud-aws-core/src/main/java/org/springframework/cloud/aws/core/io/s3/SimpleStorageResource.java b/spring-cloud-aws-core/src/main/java/org/springframework/cloud/aws/core/io/s3/SimpleStorageResource.java index 08416daca..148d5ce84 100644 --- a/spring-cloud-aws-core/src/main/java/org/springframework/cloud/aws/core/io/s3/SimpleStorageResource.java +++ b/spring-cloud-aws-core/src/main/java/org/springframework/cloud/aws/core/io/s3/SimpleStorageResource.java @@ -144,7 +144,11 @@ public String getFilename() throws IllegalStateException { @Override public URL getURL() throws IOException { Region region = this.amazonS3.getRegion().toAWSRegion(); - String encodedObjectName = URLEncoder.encode(this.objectName, StandardCharsets.UTF_8.toString()); + List splits = new ArrayList<>(); + for (String split : this.objectName.split("/")) { + splits.add(URLEncoder.encode(split, StandardCharsets.UTF_8.toString())); + } + String encodedObjectName = String.join("/", splits); return new URL("https", region.getServiceEndpoint(AmazonS3Client.S3_SERVICE_NAME), "/" + this.bucketName + "/" + encodedObjectName); } diff --git a/spring-cloud-aws-core/src/test/java/org/springframework/cloud/aws/core/io/s3/SimpleStorageResourceTest.java b/spring-cloud-aws-core/src/test/java/org/springframework/cloud/aws/core/io/s3/SimpleStorageResourceTest.java index a828ce5b1..4ad850de1 100644 --- a/spring-cloud-aws-core/src/test/java/org/springframework/cloud/aws/core/io/s3/SimpleStorageResourceTest.java +++ b/spring-cloud-aws-core/src/test/java/org/springframework/cloud/aws/core/io/s3/SimpleStorageResourceTest.java @@ -348,7 +348,7 @@ void getUri_encodes_objectName() throws Exception { new SyncTaskExecutor()); assertThat(resource.getURI()) - .isEqualTo(new URI("https://s3.us-west-2.amazonaws.com/bucketName/some%2F%5BobjectName%5D")); + .isEqualTo(new URI("https://s3.us-west-2.amazonaws.com/bucketName/some/%5BobjectName%5D")); } }