2012-07-20 102 views
20

我正在从URL下载ePub文件。在下载文件之前从URL解析文件名

现在我想实现一种机制,通过该机制,如果用户试图重新下载相同的文件,他应该会收到警告/错误消息,并且该文件不应该再次被下载

要实现这一点,我需要检查我的库中存在的文件的名称,用户正试图下载的文件的名称。我只是this download link,而不是文件名。

如何在下载之前获取文件的名称,以便将其与现有文件进行比较?

回答

46

在Android中,你可以使用the guessFileName() method

URLUtil.guessFileName(url, null, null) 

另外,在Java中一个简单的解决方案是:

String fileName = url.substring(url.lastIndexOf('/') + 1); 

(假设你的URL的格式为:http://xxxxxxxxxxxxx/filename.ext

+0

假设我有一个包含藏书的链接(亦即。'www.bookstore.com'),从我选择一本书(与URL'www.bookstore。 com/book1.epub'),它应该被下载到我的图书馆。 **我将如何获得特定书籍的网址,即“www.bookstore.com/book1.epub”?除了第一次加载,webView.getUrl()并不会被触发。 – GAMA 2012-07-20 11:59:22

+2

只有在没有参数(?param = value)和锚点(#anchor)的情况下,您的解决方案才有效。 – 2014-11-07 21:49:04

2

你不必真的比较文件名。只需使用绝对路径为文件创建文件对象并检查文件是否存在。

protected boolean need2Download(String fileName) { 

    File basePath = new File(BOOK_STORE_PATH); 

    File fullPath = new File(basePath, fileName); 

    if (fullPath.exists()) 
     return false; 
    return true; 
} 

protected void downloadFile(String url) { 
    String fileName = url.substring(url.lastIndexOf('/') + 1); 

    if (need2Download(fileName)) { 
     // download 
    } 
} 
4

保持简单:

/** 
* 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]; 
} 
1

我认为使用URL#的getPath()应该简化事情。

public static String getFileNameFromUrl(URL url) { 

    String urlPath = url.getPath(); 

    return urlPath.substring(urlPath.lastIndexOf('/') + 1); 
} 

见,http://developer.android.com/reference/java/net/URL.html#getPath()

+0

我使用它,但不是因为简化的事情,与getPath()你可以处理具有像httt://domain.com/file.ext?a = 1#锚的查询参数的url @TimAutin对我来说更具可读性。 – Davide 2017-02-01 11:44:40