web-dev-qa-db-fra.com

Comment déterminer l'extension de fichier d'un fichier à partir d'un uri

En supposant que l'on me donne un URI et que je souhaite trouver l'extension du fichier renvoyé, que dois-je faire en Java.

Par exemple, le fichier à http://www.daml.org/2001/08/baseball/baseball-ont est http://www.daml.org/2001/08/ baseball/baseball-ont.owl

Quand je fais

    URI uri = new URI(address); 
    URL url = uri.toURL();
    String file = url.getFile();
    System.out.println(file);

Je ne peux pas voir le nom de fichier complet avec .owl extension, juste /2001/08/baseball/baseball-ont comment puis-je obtenir l'extension du fichier. ''

22
Ankur

Tout d'abord, je veux m'assurer que vous savez qu'il est impossible de savoir quel type de fichier un lien URI contient également, car un lien se terminant par .jpg peut vous permettre d'accéder à un .exe file (ceci est particulièrement vrai pour les URL, en raison des liens symboliques et des fichiers .htaccess), donc ce n'est pas une solution solide pour récupérer l'extension real de l'URI si vous voulez limiter types de fichiers autorisés, si c'est ce que vous cherchez bien sûr. Donc, je suppose que vous voulez simplement savoir quelle extension un fichier a basé sur son URI même si ce n'est pas complètement fiable;

Vous pouvez obtenir l'extension à partir de n'importe quel URI, URL ou chemin de fichier en utilisant la méthode ci-dessous. Vous n'avez pas besoin d'utiliser de bibliothèques ou d'extensions, car il s'agit d'une fonctionnalité de base Java. Cette solution obtient la position du dernier . (point) signe dans la chaîne URI et crée une sous-chaîne commençant à la position du signe point, se terminant à la fin de la chaîne URI.

String uri = "http://www.google.com/support/enterprise/static/gsa/docs/admin/70/gsa_doc_set/integrating_apps/images/google_logo.png";
String extension = uri.substring(uri.lastIndexOf("."));

Cet exemple de code ci-dessus affichera le .png extension de l'URI dans la variable extension, notez qu'un . (point) est inclus dans l'extension, si vous voulez rassembler l'extension de fichier sans point préfixé, augmentez l'index de sous-chaîne de un, comme ceci:

String extension = uri.substring(url.lastIndexOf(".") + 1);

Un pro pour utiliser cette méthode par rapport aux expressions régulières (une méthode que d'autres utilisent beaucoup) est que c'est beaucoup moins cher en ressources et beaucoup moins lourd à exécuter tout en donnant le même résultat.

En outre, vous pouvez vous assurer que l'URL contient un caractère point, utilisez le code suivant pour y parvenir:

String uri = "http://www.google.com/support/enterprise/static/gsa/docs/admin/70/gsa_doc_set/integrating_apps/images/google_logo.png";
if(uri.contains(".")) {
    String extension = uri.substring(url.lastIndexOf("."));
}

Vous voudrez peut-être améliorer encore davantage le fonctionnement pour créer un système plus robuste. Deux exemples pourraient être:

  • Validez l'URI en vérifiant qu'il existe ou en vous assurant que la syntaxe de l'URI est valide, en utilisant éventuellement une expression régulière.
  • Coupez l'extension pour supprimer les espaces blancs indésirables.

Je ne couvrirai pas les solutions pour ces deux fonctionnalités ici, car ce n'est pas ce qui était demandé en premier lieu.

J'espère que cela t'aides!

61
Tim Visée

Il y a deux réponses à cela.

Si un URI n'a pas "d'extension de fichier", il n'y a aucun moyen d'en déduire un en le regardant textuellement ou en le convertissant en File. En général, ni l'URI ni le fichier ne doivent avoir d'extension du tout. Les extensions ne sont qu'une convention de dénomination de fichier .

Ce que vous recherchez vraiment, c'est le type de média/type MIME/type de contenu du fichier. Vous pourrez peut-être déterminer le type de média en faisant quelque chose comme ceci:

URLConnection conn = url.connect();
String type = conn.getContentType();

Cependant, la méthode getContentType() renverra null si le serveur n'a pas défini de type de contenu dans la réponse. (Ou cela pourrait vous donner le mauvais type de contenu, ou un type de contenu non spécifique.) À ce stade, vous devrez recourir au type de contenu "deviner", et je ne sais pas si cela vous donnerait un contenu suffisamment spécifique tapez dans ce cas.

Mais si vous "savez" que le fichier devrait être OWL, pourquoi ne lui donnez-vous pas une extension ".owl" de toute façon?

15
Stephen C

Ce lien pourrait aider ceux qui ont encore des problèmes: Comment puis-je obtenir le type mime d'un fichier ayant son Uri?

 public static String getMimeType(Context context, Uri uri) {
    String extension;

    //Check uri format to avoid null
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
        //If scheme is a content
        final MimeTypeMap mime = MimeTypeMap.getSingleton();
        extension = mime.getExtensionFromMimeType(context.getContentResolver().getType(uri));
    } else {
        //If scheme is a File
        //This will replace white spaces with %20 and also other special characters. This will avoid returning null values on file name with spaces and special characters.
        extension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uri.getPath())).toString());

    }

    return extension;
}
10
Aaron

URLConnection.guessContentTypeFromName(url) fournirait le type mime comme dans la première réponse. Peut-être que vous vouliez simplement:

String extension = url.getPath().replaceFirst("^.*/[^/]*(\\.[^\\./]*|)$", "$1");

L'expression régulière consommant tout jusqu'à la dernière barre oblique, puis jusqu'à un point et renvoie une extension comme ".owl" ou "". (Si vous ne vous trompez pas)

5
Joop Eggen

La réponse acceptée n'est pas utile car l'URL contient "?" ou '/' après l'extension. Ainsi, pour supprimer cette chaîne supplémentaire, vous pouvez utiliser la méthode getLastPathSegment (). Il vous donne uniquement le nom de uri et vous pouvez ensuite obtenir l'extension comme suit:

String name = uri.getLastPathSegment();
//Here uri is your uri from which you want to get extension
String extension = name.substring(name.lastIndexOf("."));

le code ci-dessus obtient l'extension avec. (point) si vous souhaitez supprimer le point, vous pouvez coder comme suit:

String extension = name.substring(name.lastIndexOf(".") + 1);
2
Nevil Ghelani

Un autre moyen utile qui n'est pas mentionné dans la réponse acceptée est: Si vous avez une URL distante, vous pouvez obtenir mimeType à partir d'URLConnection, comme

  URLConnection urlConnection = new URL("http://www.google.com").openConnection();
  String mimeType = urlConnection.getContentType(); 

Maintenant, pour obtenir l'extension de fichier de MimeType, je vais me référer à ceci post

1
Asad Ali Choudhry

Comme d'autres réponses l'ont expliqué, vous ne connaissez pas vraiment le type de contenu sans inspecter le fichier. Cependant, vous pouvez prédire le type de fichier à partir d'une URL.

Java presque fournit cette fonctionnalité dans le cadre de la classe URL. La méthode URL::getFile récupérera intelligemment la partie fichier d'un URL:

final URL url = new URL("http://www.example.com/a/b/c/stuff.zip?u=1");
final String file = url.getFile(); // file = "/a/b/c/stuff.zip?u=1"

Nous pouvons l'utiliser pour écrire notre implémentation:

public static Optional<String> getFileExtension(final URL url) {

    Objects.requireNonNull(url, "url is null");

    final String file = url.getFile();

    if (file.contains(".")) {

        final String sub = file.substring(file.lastIndexOf('.') + 1);

        if (sub.length() == 0) {
            return Optional.empty();
        }

        if (sub.contains("?")) {
            return Optional.of(sub.substring(0, sub.indexOf('?')));
        }

        return Optional.of(sub);
    }

    return Optional.empty();
}

Cette implémentation doit gérer correctement les cas Edge:

assertEquals(
    Optional.of("Zip"), 
    getFileExtension(new URL("http://www.example.com/stuff.Zip")));

assertEquals(
    Optional.of("Zip"), 
    getFileExtension(new URL("http://www.example.com/stuff.Zip")));

assertEquals(
    Optional.of("Zip"), 
    getFileExtension(new URL("http://www.example.com/a/b/c/stuff.Zip")));

assertEquals(
    Optional.empty(), 
    getFileExtension(new URL("http://www.example.com")));

assertEquals(
    Optional.empty(), 
    getFileExtension(new URL("http://www.example.com/")));

assertEquals(
    Optional.empty(), 
    getFileExtension(new URL("http://www.example.com/.")));
1
sdgfsdh

Je le fais de cette façon.

Vous pouvez vérifier n'importe quelle extension de fichier avec plus de validation:

String stringUri = uri.toString();
String fileFormat = "png";

                    if (stringUri.contains(".") && fileFormat.equalsIgnoreCase(stringUri.substring(stringUri.lastIndexOf(".") + 1))) {

                        // do anything

                    } else {

                        // invalid file

                    }
0
Vikasdeep Singh