Parse file name from URL before downloading the file
In android you can use the guessFileName() method:
URLUtil.guessFileName(url, null, null)
Alternatively, a simplistic solution in Java could be:
String fileName = url.substring(url.lastIndexOf('/') + 1);
(Assuming your url is in the format: http://xxxxxxxxxxxxx/filename.ext
)
UPDATE March 23, 2018
This question is getting lots of hits and someone commented my 'simple' solution does not work with certain urls so I felt the need to improve the answer.
In case you want to handle more complex url pattern, I provided a sample solution below. It gets pretty complex quite quickly and I'm pretty sure there are some odd cases my solution still can't handle but nevertheless here it goes:
public static String getFileNameFromURL(String url) { if (url == null) { return ""; } try { URL resource = new URL(url); String host = resource.getHost(); if (host.length() > 0 && url.endsWith(host)) { // handle ...example.com return ""; } } catch(MalformedURLException e) { return ""; } int startIndex = url.lastIndexOf('/') + 1; int length = url.length(); // find end index for ? int lastQMPos = url.lastIndexOf('?'); if (lastQMPos == -1) { lastQMPos = length; } // find end index for # int lastHashPos = url.lastIndexOf('#'); if (lastHashPos == -1) { lastHashPos = length; } // calculate the end index int endIndex = Math.min(lastQMPos, lastHashPos); return url.substring(startIndex, endIndex);}
This method can handle these type of input:
Input: "null" Output: ""Input: "" Output: ""Input: "file:///home/user/test.html" Output: "test.html"Input: "file:///home/user/test.html?id=902" Output: "test.html"Input: "file:///home/user/test.html#footer" Output: "test.html"Input: "http://example.com" Output: ""Input: "http://www.example.com" Output: ""Input: "http://www.example.txt" Output: ""Input: "http://example.com/" Output: ""Input: "http://example.com/a/b/c/test.html" Output: "test.html"Input: "http://example.com/a/b/c/test.html?param=value" Output: "test.html"Input: "http://example.com/a/b/c/test.html#anchor" Output: "test.html"Input: "http://example.com/a/b/c/test.html#anchor?param=value" Output: "test.html"
You can find the whole source code here: https://ideone.com/uFWxTL
Try to use URLUtil.guessFileName(url, null, null)
for example. I think this is the best Android way.
More info here: https://developer.android.com/reference/android/webkit/URLUtil.html#guessFileName(java.lang.String, java.lang.String, java.lang.String)
Keep it simple :
/** * This function will take an URL as input and return the file name. * <p>Examples :</p> * <ul> * <li>http://example.com/a/b/c/test.txt -> test.txt</li> * <li>http://example.com/ -> an empty string </li> * <li>http://example.com/test.txt?param=value -> test.txt</li> * <li>http://example.com/test.txt#anchor -> test.txt</li> * </ul> * * @param url The input URL * @return The URL file name */public static String getFileNameFromUrl(URL url) { String urlString = url.getFile(); return urlString.substring(urlString.lastIndexOf('/') + 1).split("\\?")[0].split("#")[0];}