Parse file name from URL before downloading the file

后端 未结 6 1659
眼角桃花
眼角桃花 2020-12-24 01:18

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 messag

6条回答
  •  滥情空心
    2020-12-24 02:04

    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

提交回复
热议问题