在下载文件之前从URL解析文件名
我正在从URL下载ePub文件。在下载文件之前从URL解析文件名
现在我想实现一种机制,通过该机制,如果用户试图重新下载相同的文件,他应该会收到警告/错误消息,并且该文件不应该再次被下载。
要实现这一点,我需要检查我的库中存在的文件的名称,用户正试图下载的文件的名称。我只是this download link,而不是文件名。
如何在下载之前获取文件的名称,以便将其与现有文件进行比较?
在Android中,你可以使用the guessFileName() method:
URLUtil.guessFileName(url, null, null)
另外,在Java中一个简单的解决方案是:
String fileName = url.substring(url.lastIndexOf('/') + 1);
(假设你的URL的格式为:http://xxxxxxxxxxxxx/filename.ext
)
你不必真的比较文件名。只需使用绝对路径为文件创建文件对象并检查文件是否存在。
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
}
}
尝试使用URLUtil.guessFileName(url, null, null)
例如。我认为这是最好的Android方式。
这应该被标记为正确的答案 – 2016-06-23 14:35:56
保持简单:
/**
* 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];
}
我认为使用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()
我使用它,但不是因为简化的事情,与getPath()你可以处理具有像httt://domain.com/file.ext?a = 1#锚的查询参数的url @TimAutin对我来说更具可读性。 – Davide 2017-02-01 11:44:40
假设我有一个包含藏书的链接(亦即。'www.bookstore.com'),从我选择一本书(与URL'www.bookstore。 com/book1.epub'),它应该被下载到我的图书馆。 **我将如何获得特定书籍的网址,即“www.bookstore.com/book1.epub”?除了第一次加载,webView.getUrl()并不会被触发。 – GAMA 2012-07-20 11:59:22
只有在没有参数(?param = value)和锚点(#anchor)的情况下,您的解决方案才有效。 – 2014-11-07 21:49:04