Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parse file name from URL before downloading the file

I'm downloading an ePub file from a URL.

Now I want to implement a mechanism by which if user tries to re-download the same file, he should get warning/error message and that file should not be downloaded again.

To implement this, I need to check the name of the file present in my library with the name of the file user is trying to download.

But I just have this download link, and not the file name.

How to get the name of the file before download in order to compare it with the existing file?

like image 239
GAMA Avatar asked Jul 20 '12 08:07

GAMA


1 Answers

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

like image 85
Caner Avatar answered Oct 23 '22 13:10

Caner