web-dev-qa-db-ja.com

URIからファイルのファイル拡張子を判別する方法

URIが指定されていて、返されたファイルのファイル拡張子を検索したい場合、Javaで何をする必要がありますか。

たとえば http://www.daml.org/2001/08/baseball/baseball-ont にあるファイルは http://www.daml.org/2001/08/です。 baseball/baseball-ont.owl

私がする時

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

.owl拡張子が付いた完全なファイル名を表示できません。/2001/08/baseball/baseball-ontだけでファイル拡張子も取得できます。 「」

22
Ankur

最初に、.jpgで終わるリンクが.exeファイルにアクセスする可能性があるため、URIがリンクするファイルの種類を見つけることが不可能であることを確認します(これは特に当てはまります)。 URLの場合、シンボリックリンクと.htaccessファイルのため)、許可されているファイルタイプを制限する場合、URIからreal拡張子をフェッチするのは確かな解決策ではありません。もちろん行きます。したがって、完全に信頼できるわけではありませんが、ファイルのURIに基づいてファイルの拡張子を知りたいだけだと思います。

以下のメソッドを使用して、URI、URL、またはファイルパスから拡張子を取得できます。これは基本的なJava機能です。ライブラリや拡張機能を使用する必要はありません。このソリューションは、URI文字列の最後の.(ピリオド)記号の位置を取得します。そして、ピリオド記号の位置で始まり、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("."));

上記のこのコードサンプルは、extension変数のURIから.png拡張を出力します。拡張を収集する場合、.(ピリオド)が拡張に含まれていることに注意してください。接頭辞付きのピリオドのないファイル拡張子は、次のように部分文字列インデックスを1つ増やします。

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

この方法を正規表現(他の人が頻繁に使用する方法)に対して使用することの1つの利点は、同じ結果を提供しながら実行するリソースのコストが大幅に削減され、実行する負荷が大幅に軽減されることです。

さらに、URLにピリオド文字が含まれていることを確認したい場合は、次のコードを使用してこれを実現します。

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("."));
}

より堅牢なシステムを作成するために、機能をさらに改善したい場合があります。次の2つの例が考えられます。

  • URIの存在を確認するか、URIの構文が有効であることを確認して、おそらく正規表現を使用して、URIを検証します。
  • 拡張機能をトリミングして、不要な空白を削除します。

ここでは、これらの2つの機能のソリューションについては説明しません。そもそもそれが求められていることではないからです。

お役に立てれば!

61
Tim Visée

これには2つの答えがあります。

URIに「ファイル拡張子」がない場合、URIをテキストで見たり、Fileに変換したりして推測する方法はありません。一般に、URIとファイルのどちらにも拡張子を付ける必要はありません。拡張子は単なるファイル名の規約です。

あなたが本当に求めているのは、ファイルのメディアタイプ/ MIMEtype /コンテンツタイプです。次のような方法でメディアタイプを判別できる場合があります。

_URLConnection conn = url.connect();
String type = conn.getContentType();
_

ただし、サーバーが応答でコンテンツタイプを設定しなかった場合、 getContentType() メソッドはnullを返します。 (または、間違ったコンテンツタイプや非特定のコンテンツタイプを提供する可能性があります。)その時点で、コンテンツタイプを「推測」に頼る必要があります。この場合は入力します。

しかし、ファイルshouldがOWLであることを "知っている"場合は、とにかく ".owl"拡張子を付けてみませんか?

15
Stephen C

このリンクは、まだ問題が解決しない場合に役立ちます: Uriを持つファイルのMIMEタイプを取得するにはどうすればよいですか?

 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)は、最初の回答のようにMIMEタイプを提供します。多分あなたは単に欲しかった:

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

最後のスラッシュからピリオドまでをすべて消費し、 "。owl"や ""のような拡張子を返す正規表現。 (間違えない場合)

5
Joop Eggen

受け入れられた回答は、URLに「?」が含まれている場合は役に立ちませんまたは拡張子の後に「/」。したがって、その余分な文字列を削除するには、getLastPathSegment()メソッドを使用できます。これは、uriからの名前のみを提供し、次のように拡張子を取得できます。

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

上記のコードは。(dot)で拡張子を取得します。ドットを削除する場合は、次のようにコーディングできます。

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

受け入れられた回答で言及されていない別の便利な方法は、リモートURLがある場合、URLConnectionからmimeTypeを取得できることです。

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

MimeTypeからファイル拡張子を取得するために、これを参照します post

1

他の回答で説明されているように、ファイルを調べないと、コンテンツタイプがわかりません。ただし、URLからファイルタイプを予測できます。

Java ほぼは、この機能をURLクラスの一部として提供します。メソッドURL::getFileは、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"

これを使用して、実装を記述できます。

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

この実装は、エッジケースを適切に処理する必要があります。

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

私はこのようにしています。

より多くの検証で任意のファイル拡張子をチェックできます:

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