Return URL-decoded file name from UrlResource#getFilename()

Prior to this commit, UrlResource#getFilename() returned the filename
of the resource URL-encoded which is in contrast to what
FileSystemResource#getFilename() returns for an equivalent resource.

In addition, users most likely expect that a filename returned from a
method defined in the Resource interface is unencoded.

This commit therefore revises UrlResource#getFilename() so that it
always returns the filename URL-decoded.

Closes gh-29261
This commit is contained in:
Sam Brannen
2022-10-05 15:43:40 +02:00
parent 084d7d1bdc
commit 0aa9d9d535
3 changed files with 27 additions and 5 deletions

View File

@@ -158,10 +158,11 @@ public interface Resource extends InputStreamSource {
Resource createRelative(String relativePath) throws IOException;
/**
* Determine a filename for this resource, i.e. typically the last
* part of the path: for example, "myfile.txt".
* Determine the filename for this resource — typically the last
* part of the path — for example, {@code "myfile.txt"}.
* <p>Returns {@code null} if this type of resource does not
* have a filename.
* <p>Implementations are encouraged to return the filename unencoded.
*/
@Nullable
String getFilename();

View File

@@ -26,6 +26,8 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@@ -316,12 +318,15 @@ public class UrlResource extends AbstractFileResolvingResource {
}
/**
* This implementation returns the name of the file that this URL refers to.
* This implementation returns the URL-decoded name of the file that this URL
* refers to.
* @see java.net.URL#getPath()
* @see java.net.URLDecoder#decode(String, java.nio.charset.Charset)
*/
@Override
public String getFilename() {
return StringUtils.getFilename(getCleanedUrl().getPath());
String filename = StringUtils.getFilename(getCleanedUrl().getPath());
return URLDecoder.decode(filename, StandardCharsets.UTF_8);
}
/**