在下载文件之前从URL解析文件名

我正在从URL下载ePub文件。

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

为了实现这一点,我需要检查我的库中存在的文件的名称,以及用户试图下载的文件的名称。

但我只有这个下载链接 ,而不是文件名。

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

  • 改造2档文件/上传
  • android - 扩展库有很多问题
  • 在Android上通过浏览器下载文件时避免内容types问题
  • 如何恢复中断下载 - 第2部分
  • Android Webview:无法调用determinVisibility() - 从未看到pid的连接
  • 获取YouTubevideo的下载url(Android / Java)
  • 使用Cordova FileTransfer将文件保存到公共目录
  • 如何将图像从其URL传输到SD卡?
  • 在android中你可以使用guessFileName()方法 :

    URLUtil.guessFileName(url, null, null) 

    或者,Java中的简单解决方案可以是:

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

    (假设您的url格式为: http://xxxxxxxxxxxxx/filename.ext

    更新2018年3月23日

    这个问题得到了很多点击,有人评论我的“简单”解决方案不适用于某些url,所以我觉得有必要改进答案。

    如果您想处理更复杂的url模式,我在下面提供了一个示例解决方案。 它变得相当复杂很快,我很确定有一些奇怪的情况,我的解决方案仍然无法处理,但在这里它是:

     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); } 

    此方法可以处理这些types的输入:

     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" 

    您可以在此处find完整的源代码: https : //ideone.com/uFWxTL

    例如,尝试使用URLUtil.guessFileName(url, null, null) 。 我认为这是最好的Android方式。

    更多信息: https : //developer.android.com/reference/android/webkit/URLUtil.html#guessFileName(java.lang.String,java.lang.String,java.lang.String)

    把事情简单化 :

     /** * This function will take an URL as input and return the file name. * 

    Examples :

    *
      *
    • http://example.com/a/b/c/test.txt -> test.txt
    • *
    • http://example.com/ -> an empty string
    • *
    • http://example.com/test.txt?param=value -> test.txt
    • *
    • http://example.com/test.txt#anchor -> test.txt
    • *
    * * @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]; }

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

     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 } } 

    我认为使用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()