webentwicklung-frage-antwort-db.com.de

Analysieren Sie den Dateinamen vor dem Herunterladen der Datei anhand der URL

Ich lade eine ePub-Datei von einer URL herunter.

Jetzt möchte ich einen Mechanismus implementieren, durch den der Benutzer, wenn er versucht, dieselbe Datei erneut herunterzuladen, eine Warnung/Fehlermeldung erhalten sollte und diese Datei sollte nicht erneut heruntergeladen werden.

Um dies zu implementieren, muss ich den Namen der in meiner Bibliothek vorhandenen Datei mit dem Namen der Datei überprüfen, die der Benutzer versucht, herunterzuladen.

Aber ich habe nur diesen Download-Link und nicht den Dateinamen.

Wie bekomme ich den Namen der Datei vor dem Download, um sie mit der vorhandenen Datei zu vergleichen?

26
GAMA

In Android können Sie die Methode guessFileName () verwenden :

URLUtil.guessFileName(url, null, null)

Alternativ könnte eine vereinfachte Lösung in Java Folgendes sein:

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

(Angenommen, Ihre URL hat das Format: http://xxxxxxxxxxxxx/filename.ext)

UPDATE 23. März 2018

Diese Frage erhält viele Treffer und jemand kommentierte, dass meine "einfache" Lösung mit bestimmten URLs nicht funktioniert. Ich hatte das Bedürfnis, die Antwort zu verbessern.

Für den Fall, dass Sie mit komplexeren URL-Mustern umgehen möchten, habe ich unten eine Musterlösung bereitgestellt. Es wird ziemlich schnell ziemlich komplex und ich bin mir ziemlich sicher, dass es einige seltsame Fälle gibt, mit denen meine Lösung immer noch nicht umgehen kann. Trotzdem geht es hier:

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

Diese Methode kann diese Art von Eingabe verarbeiten:

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"

Den gesamten Quellcode finden Sie hier: https://ideone.com/uFWxTL

65
Caner

Versuchen Sie beispielsweise, URLUtil.guessFileName(url, null, null) zu verwenden. Ich denke, das ist der beste Android-Weg.

Weitere Infos hier: https://developer.Android.com/reference/Android/webkit/URLUtil.html#guessFileName(Java.lang.String, Java.lang.String, Java.lang.String)

39
sealskej

Halte es einfach :

/**
 * 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

Sie müssen nicht wirklich Dateinamen vergleichen. Machen Sie einfach File object für die Datei mit absolutem Pfad und prüfen Sie, ob die Datei existiert.

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

Ich denke, die Verwendung der URL # getPath () sollte die Dinge vereinfachen.

public static String getFileNameFromUrl(URL url) {

    String urlPath = url.getPath();

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

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

1

Abrufen des Dateinamens von FilenameUtils von Apache commons-io

URL url = URL(fileUrl)
String fileName = FilenameUtils.getName(url.getPath())

Dazu füge commons-io Abhängigkeit in build.gradle (App)

implementation "commons-io:commons-io:2.6"

Es extrahiert auch den Dateinamen aus der komplexen URL wie unten

http://www.example.com/some/path/to/a/file.xml?foo=bar#test

0
Naveen Kumar M