[英]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沒有“文件擴展名”,那么您無法通過文本查看或將其轉換為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.