Skip to content

Commit f3b1f37

Browse files
committed
Process URL path for filename extraction if URI does not expose path
Closes gh-31718
1 parent df00aaf commit f3b1f37

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

spring-core/src/main/java/org/springframework/core/io/UrlResource.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -332,13 +332,15 @@ protected URL createRelativeURL(String relativePath) throws MalformedURLExceptio
332332
@Nullable
333333
public String getFilename() {
334334
if (this.uri != null) {
335-
// URI path is decoded and has standard separators
336-
return StringUtils.getFilename(this.uri.getPath());
337-
}
338-
else {
339-
String filename = StringUtils.getFilename(StringUtils.cleanPath(this.url.getPath()));
340-
return (filename != null ? URLDecoder.decode(filename, StandardCharsets.UTF_8) : null);
335+
String path = this.uri.getPath();
336+
if (path != null) {
337+
// Prefer URI path: decoded and has standard separators
338+
return StringUtils.getFilename(this.uri.getPath());
339+
}
341340
}
341+
// Otherwise, process URL path
342+
String filename = StringUtils.getFilename(StringUtils.cleanPath(this.url.getPath()));
343+
return (filename != null ? URLDecoder.decode(filename, StandardCharsets.UTF_8) : null);
342344
}
343345

344346
/**

spring-core/src/test/java/org/springframework/core/io/ResourceTests.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,11 +302,28 @@ void sameResourceWithRelativePathIsEqual() throws Exception {
302302

303303
@Test
304304
void filenameIsExtractedFromFilePath() throws Exception {
305+
assertThat(new UrlResource("file:test?argh").getFilename()).isEqualTo("test");
306+
assertThat(new UrlResource("file:/test?argh").getFilename()).isEqualTo("test");
307+
assertThat(new UrlResource("file:test.txt?argh").getFilename()).isEqualTo("test.txt");
308+
assertThat(new UrlResource("file:/test.txt?argh").getFilename()).isEqualTo("test.txt");
309+
assertThat(new UrlResource("file:/dir/test?argh").getFilename()).isEqualTo("test");
305310
assertThat(new UrlResource("file:/dir/test.txt?argh").getFilename()).isEqualTo("test.txt");
306311
assertThat(new UrlResource("file:\\dir\\test.txt?argh").getFilename()).isEqualTo("test.txt");
307312
assertThat(new UrlResource("file:\\dir/test.txt?argh").getFilename()).isEqualTo("test.txt");
308313
}
309314

315+
@Test
316+
void filenameIsExtractedFromURL() throws Exception {
317+
assertThat(new UrlResource(new URL("file:test?argh")).getFilename()).isEqualTo("test");
318+
assertThat(new UrlResource(new URL("file:/test?argh")).getFilename()).isEqualTo("test");
319+
assertThat(new UrlResource(new URL("file:test.txt?argh")).getFilename()).isEqualTo("test.txt");
320+
assertThat(new UrlResource(new URL("file:/test.txt?argh")).getFilename()).isEqualTo("test.txt");
321+
assertThat(new UrlResource(new URL("file:/dir/test?argh")).getFilename()).isEqualTo("test");
322+
assertThat(new UrlResource(new URL("file:/dir/test.txt?argh")).getFilename()).isEqualTo("test.txt");
323+
assertThat(new UrlResource(new URL("file:\\dir\\test.txt?argh")).getFilename()).isEqualTo("test.txt");
324+
assertThat(new UrlResource(new URL("file:\\dir/test.txt?argh")).getFilename()).isEqualTo("test.txt");
325+
}
326+
310327
@Test
311328
void filenameContainingHashTagIsExtractedFromFilePathUnencoded() throws Exception {
312329
String unencodedPath = "/dir/test#1.txt";

0 commit comments

Comments
 (0)