Dateinamen von URL abrufen

Lesezeit: 6 Minuten

Dateinamen von URL abrufen
Sietse

In Java gegeben a java.net.URL oder ein String in Form von http://www.example.com/some/path/to/a/file.xml , was ist der einfachste Weg, den Dateinamen abzüglich der Erweiterung zu erhalten? In diesem Beispiel suche ich also nach etwas, das zurückkehrt "file".

Ich kann mir mehrere Möglichkeiten vorstellen, dies zu tun, aber ich suche nach etwas, das leicht zu lesen und kurz ist.

  • SIE wissen, dass es nicht erforderlich ist, am Ende einen Dateinamen oder etwas, das wie ein Dateiname aussieht, anzugeben. In diesem Fall kann eine Datei.xml auf dem Server vorhanden sein oder nicht.

    – miserable Variable

    3. März ’09 um 9:47

  • in diesem Fall wäre das Ergebnis eine leere Zeichenfolge oder möglicherweise null.

    – Sietse

    3. März ’09 um 9:57

  • Ich denke, Sie müssen das Problem klarer definieren. Was ist mit folgenden URLS-Endungen? …./abc, …./abc/, …./abc.def, …./abc.def.ghi, …./abc?def.ghi

    – miserable Variable

    3. März ’09 um 10:10

  • Ich denke, es ist ziemlich klar. Wenn die URL auf eine Datei verweist, interessiere ich mich für den Dateinamen abzüglich der Erweiterung (sofern vorhanden). Abfrageteile liegen außerhalb des Dateinamens.

    – Sietse

    3. März ’09 um 10:29

  • der Dateiname ist der Teil der URL nach dem letzten Schrägstrich. die Dateierweiterung ist der Teil des Dateinamens nach dem letzten Punkt.

    – Sietse

    12. Juni ’12 um 10:59


Dateinamen von URL abrufen
Adrian B.

Anstatt das Rad neu zu erfinden, wie wäre es mit Apache Commons-io:

import org.apache.commons.io.FilenameUtils;

public class FilenameUtilTest {

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://www.example.com/some/path/to/a/file.xml?foo=bar#test");

        System.out.println(FilenameUtils.getBaseName(url.getPath())); // -> file
        System.out.println(FilenameUtils.getExtension(url.getPath())); // -> xml
        System.out.println(FilenameUtils.getName(url.getPath())); // -> file.xml
    }

}

  • Zumindest in der Version commons-io 2.2 müssen URLs noch manuell mit Parametern behandelt werden. Z.B “example.com/file.xml?date=2010-10-20

    – Luke Quinane

    13. August ’13 um 5:14

  • FilenameUtils.getName(url) passt besser.

    – ehsun7b

    22. Apr. ’14 um 6:05

  • Es erscheint seltsam, eine Abhängigkeit von commons-io hinzuzufügen, wenn einfache Lösungen einfach mit dem JDK verfügbar sind (siehe URL#getPath und String#substring oder Path#getFileName oder File#getName).

    – Jason C

    6. Mai ’15 um 20:31


  • Die FilenameUtils-Klasse wurde entwickelt, um mit Windows und *nix-Pfad zu arbeiten, nicht mit URL.

    – nhahtdh

    29. Juli ’15 um 9:22

  • Beispiel aktualisiert, um eine URL zu verwenden, Beispielausgabewerte anzuzeigen und Abfrageparameter zu verwenden.

    – Nick Grely

    28. Oktober ’16 bei 4:12

1641667185 349 Dateinamen von URL abrufen
Echtes Rot.

String fileName = url.substring( url.lastIndexOf("https://stackoverflow.com/")+1, url.length() );

String fileNameWithoutExtn = fileName.substring(0, fileName.lastIndexOf('.'));

  • Warum die Ablehnung? Das ist unfair. Mein Code funktioniert, ich habe meinen Code gerade überprüft, nachdem ich die Ablehnung gesehen habe.

    – Echtes Rot.

    3. März ’09 um 9:49

  • Ich habe dich positiv bewertet, weil es etwas lesbarer ist als meine Version. Die Ablehnung kann daran liegen, dass es nicht funktioniert, wenn keine Erweiterung oder keine Datei vorhanden ist.

    – Sietse

    3. März ’09 um 9:59

  • Sie können den zweiten Parameter weglassen, um substring()

    – Jon Onstott

    6. Dezember ’14 um 23:47

  • Das funktioniert bei beiden nicht http://example.org/file#anchor, http://example.org/file?p=foo&q=bar Noch http://example.org/file.xml#/p=foo&q=bar

    – Matthias Ronge

    29. Januar ’15 um 8:58

  • Wenn du lässt String url = new URL(original_url).getPath() und fügen Sie einen Sonderfall für Dateinamen hinzu, die kein a . enthalten . dann funktioniert das gut.

    – Jason C

    6. Mai ’15 um 20:28

Wenn Sie die Dateierweiterung nicht entfernen müssen, können Sie dies ohne fehleranfällige String-Manipulation und ohne Verwendung externer Bibliotheken tun. Funktioniert mit Java 1.7+:

import java.net.URI
import java.nio.file.Paths

String url = "http://example.org/file?p=foo&q=bar"
String filename = Paths.get(new URI(url).getPath()).getFileName().toString()

  • @Carcigenate Ich habe es gerade noch einmal getestet und es scheint gut zu funktionieren. URI.getPath() gibt a . zurück String, also verstehe ich nicht, warum es nicht funktionieren sollte

    – Zoltán

    23. März ’18 um 10:15

  • Nvm. Mir ist jetzt klar, dass mein Problem darauf zurückzuführen ist, wie Clojure Var-Args während der Java-Interop behandelt. Die String-Überladung funktionierte nicht, da auch ein leeres Array übergeben werden musste, um die Var-Args von Paths/get zu verarbeiten. Es funktioniert jedoch immer noch, wenn Sie den Anruf loswerden getPath, und verwenden Sie stattdessen die URI-Überladung.

    – krebserregend

    23. März ’18 um 13:00


  • @Carcigenate meinst du Paths.get(new URI(url))? Das scheint bei mir nicht zu funktionieren

    – Zoltán

    11. Januar ’19 um 9:49

  • getFileName erfordert Android-API-Level 26

    – Manuela

    12. März ’20 um 9:11

1641667185 978 Dateinamen von URL abrufen
tehvan

Dies sollte es ungefähr schaffen (die Fehlerbehandlung überlasse ich Ihnen):

int slashIndex = url.lastIndexOf("https://stackoverflow.com/");
int dotIndex = url.lastIndexOf('.', slashIndex);
String filenameWithoutExtension;
if (dotIndex == -1) {
  filenameWithoutExtension = url.substring(slashIndex + 1);
} else {
  filenameWithoutExtension = url.substring(slashIndex + 1, dotIndex);
}

Dateinamen von URL abrufen
juanmirocks

Einzeiler:

new File(uri.getPath).getName

Vollständiger Code (in einer scala REPL):

import java.io.File
import java.net.URI

val uri = new URI("http://example.org/file.txt?whatever")

new File(uri.getPath).getName
res18: String = file.txt

Notiz: URI#gePath ist bereits intelligent genug, um Abfrageparameter und das Schema des Protokolls zu entfernen. Beispiele:

new URI("http://example.org/hey/file.txt?whatever").getPath
res20: String = /hey/file.txt

new URI("hdfs:///hey/file.txt").getPath
res21: String = /hey/file.txt

new URI("file:///hey/file.txt").getPath
res22: String = /hey/file.txt

  • schöne Lösung!

    – CybeX

    22. Januar ’18 um 14:58 Uhr

  • Dies ist die beste Option, da nur Standard-JDK verwendet wird

    – Alexandros

    19. April ’18 um 17:36

  • Am Ende des Tages habe ich mich gerade damit abgefunden. Elegante Lösung.

    – Yusuph wickama

    3. August ’21 um 5:45

1641667185 177 Dateinamen von URL abrufen
Mike

public static String getFileName(URL extUrl) {
        //URL: "http://photosaaaaa.net/photos-ak-snc1/v315/224/13/659629384/s659629384_752969_4472.jpg"
        String filename = "";
        //PATH: /photos-ak-snc1/v315/224/13/659629384/s659629384_752969_4472.jpg
        String path = extUrl.getPath();
        //Checks for both forward and/or backslash 
        //NOTE:**While backslashes are not supported in URL's 
        //most browsers will autoreplace them with forward slashes
        //So technically if you're parsing an html page you could run into 
        //a backslash , so i'm accounting for them here;
        String[] pathContents = path.split("[\\/]");
        if(pathContents != null){
            int pathContentsLength = pathContents.length;
            System.out.println("Path Contents Length: " + pathContentsLength);
            for (int i = 0; i < pathContents.length; i++) {
                System.out.println("Path " + i + ": " + pathContents[i]);
            }
            //lastPart: s659629384_752969_4472.jpg
            String lastPart = pathContents[pathContentsLength-1];
            String[] lastPartContents = lastPart.split("\.");
            if(lastPartContents != null && lastPartContents.length > 1){
                int lastPartContentLength = lastPartContents.length;
                System.out.println("Last Part Length: " + lastPartContentLength);
                //filenames can contain . , so we assume everything before
                //the last . is the name, everything after the last . is the 
                //extension
                String name = "";
                for (int i = 0; i < lastPartContentLength; i++) {
                    System.out.println("Last Part " + i + ": "+ lastPartContents[i]);
                    if(i < (lastPartContents.length -1)){
                        name += lastPartContents[i] ;
                        if(i < (lastPartContentLength -2)){
                            name += ".";
                        }
                    }
                }
                String extension = lastPartContents[lastPartContentLength -1];
                filename = name + "." +extension;
                System.out.println("Name: " + name);
                System.out.println("Extension: " + extension);
                System.out.println("Filename: " + filename);
            }
        }
        return filename;
    }

  • schöne Lösung!

    – CybeX

    22. Januar ’18 um 14:58 Uhr

  • Dies ist die beste Option, da nur Standard-JDK verwendet wird

    – Alexandros

    19. April ’18 um 17:36

  • Am Ende des Tages habe ich mich gerade damit abgefunden. Elegante Lösung.

    – Yusuph wickama

    3. August ’21 um 5:45

1641667185 361 Dateinamen von URL abrufen
Hiren Patel

Werden Datei Name mit Erweiterung, ohne Erweiterung, nur Erweiterung mit nur 3 Zeilen:

String urlStr = "http://www.example.com/yourpath/foler/test.png";

String fileName = urlStr.substring(urlStr.lastIndexOf("https://stackoverflow.com/")+1, urlStr.length());
String fileNameWithoutExtension = fileName.substring(0, fileName.lastIndexOf('.'));
String fileExtension = urlStr.substring(urlStr.lastIndexOf("."));

Log.i("File Name", fileName);
Log.i("File Name Without Extension", fileNameWithoutExtension);
Log.i("File Extension", fileExtension);

Protokollergebnis:

File Name(13656): test.png
File Name Without Extension(13656): test
File Extension(13656): .png

Hoffe es wird dir helfen.

.

186840cookie-checkDateinamen von URL abrufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy