web-dev-qa-db-fra.com

Analyser le nom de fichier de l'URL avant de télécharger le fichier

Je télécharge un fichier ePub à partir d'une URL.

Maintenant, je veux implémenter un mécanisme par lequel si l'utilisateur essaie de télécharger à nouveau le même fichier, il devrait recevoir un message d'avertissement/d'erreur et le fichier ne devrait pas être téléchargé à nouveau.

Pour implémenter cela, je dois vérifier le nom du fichier présent dans ma bibliothèque avec le nom du fichier que l'utilisateur tente de télécharger.

Mais je viens de ce lien de téléchargement , et pas le nom du fichier.

Comment obtenir le nom du fichier avant le téléchargement afin de le comparer au fichier existant?

26
GAMA

Sous Android, vous pouvez utiliser la méthode guessFileName () :

URLUtil.guessFileName(url, null, null)

Alternativement, une solution simpliste en Java pourrait être:

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

(En supposant que votre URL est au format: http://xxxxxxxxxxxxx/filename.ext)

UPDATE 23 mars 2018

Cette question reçoit beaucoup de réponses et quelqu'un a commenté que ma solution "simple" ne fonctionnait pas avec certaines URL, j'ai donc ressenti le besoin d'améliorer la réponse.

Si vous souhaitez gérer un modèle d'URL plus complexe, j'ai fourni un exemple de solution ci-dessous. Cela devient assez complexe assez rapidement et je suis sûr qu'il y a quelques cas étranges que ma solution ne peut toujours pas gérer, mais voici ce qu'il en est:

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

Cette méthode peut gérer ces types d’entrées:

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"

Vous pouvez trouver le code source complet ici: https://ideone.com/uFWxTL

65
Caner

Essayez d'utiliser URLUtil.guessFileName(url, null, null) par exemple. Je pense que c'est la meilleure façon Android.

Plus d'infos ici: https://developer.Android.com/reference/Android/webkit/URLUtil.html#guessFileName(Java.lang.String, Java.lang.String, Java.lang.String)

39
sealskej

Rester simple :

/**
 * 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];
}
8
Tim Autin

Vous n'avez pas vraiment à comparer les noms de fichiers. Il suffit de créer File object pour le fichier avec chemin absolu et vérifier si le fichier existe.

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

Je pense que l'utilisation de l'URL # getPath () devrait simplifier les choses.

public static String getFileNameFromUrl(URL url) {

    String urlPath = url.getPath();

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

Voir, http://developer.Android.com/reference/Java/net/URL.html#getPath ()

1
Himanshu Shekhar