簡體   English   中英

如何從uri確定文件的文件擴展名

[英]How to determine the file extension of a file from a 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 .owl /2001/08/baseball/baseball-ont我如何獲得文件擴展名。 ``

首先,我想確保你知道找不到URI鏈接的文件類型也是不可能的,因為以.jpg結尾的鏈接可能會讓你訪問.exe文件(由於符號的原因,對於URL來說尤其如此)鏈接和.htaccess文件),因此,如果你想限制允許的文件類型,如果這是你當然想要的,那么從URI中獲取真正的擴展名並不是一個堅如磐石的解決方案。 所以,我假設你只是想知道一個文件基於它的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擴展extension ,注意a . (句點)包含在擴展中,如果要收集沒有前綴句點的文件擴展名,請將子字符串索引加1,如下所示:

String extension = uri.substring(url.lastIndexOf(".") + 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("."));
}

您可能希望進一步改進功能以創建更強大的系統。 兩個例子可能是:

  • 通過檢查URI是否存在來驗證URI,或者通過確保URI的語法有效,可能使用正則表達式來驗證URI。
  • 修剪擴展名以刪除不需要的空格。

我不會在這里介紹這兩個功能的解決方案,因為這不是首先要求的。

希望這可以幫助!

這有兩個答案。

如果URI沒有“文件擴展名”,那么您無法通過文本查看或將其轉換為File來推斷它。 通常,URI或文件都不需要具有擴展名。 擴展只是一個文件命名約定

您真正關注的是文件的媒體類型/ MIMEtype /內容類型。 您可以通過執行以下操作來確定媒體類型:

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

但是,如果服務器未在響應中設置內容類型,則getContentType()方法將返回null (或者它可能會給你錯誤的內容類型或非特定的內容類型。)那時,你需要訴諸內容類型“猜測”,我不知道這是否會給你一個足夠的具體輸入這種情況。

但是,如果你“知道”該文件應該是OWL,那么你為什么不給它一個“.owl”擴展呢?

此鏈接可能對那些仍然有問題的人有所幫助: 如何獲取具有其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;
}

URLConnection.guessContentTypeFromName(url)將像第一個答案中一樣傳遞mime類型。 也許你只是想要:

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

正則表達式消耗所有直到最后一個斜杠,然后到達一個句點並返回一個類似“.owl”或“”的擴展名。 (如果沒有記錯的話)

正如其他答案所解釋的那樣,如果不檢查文件,您就不會真正了解內容類型。 但是,您可以從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/.")));

接受的答案對於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("."));

上面的代碼得到擴展名。(點)如果你想刪除點,那么你可以編碼如下:

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

在接受的答案中沒有提到的另一種有用的方法是,如果你有一個遠程網址,那么你可以從URLConnection獲取mimeType,Like

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

現在要從MimeType獲取文件擴展名,我將參考這篇文章

我是這樣做的。

您可以通過更多驗證檢查任何文件擴展名:

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

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

                        // do anything

                    } else {

                        // invalid file

                    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM