uri

2010-07-13 9 views
11

से फ़ाइल का फ़ाइल एक्सटेंशन कैसे निर्धारित करें मान लें कि मुझे एक यूआरआई दिया गया है, और मैं लौटाई गई फ़ाइल का फ़ाइल एक्सटेंशन ढूंढना चाहता हूं, मुझे जावा में क्या करना है।uri

उदाहरण के लिए 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 मैं फाइल एक्सटेंशन के रूप में कैसे मिलता है कुंआ। `

उत्तर

37

सबसे पहले, मैं यह सुनिश्चित करना चाहते आप जानते हैं कि यह है, क्योंकि एक लिंक .jpg के साथ समाप्त करते हैं हो सकता है आप एक .exe फ़ाइल का उपयोग क्या यूआरआई लिंक भी फ़ाइल की तरह पता लगाने के लिए असंभव है (यह विशेष रूप से है यूआरएल के लिए सच है, प्रतीकात्मक लिंक और .htaccess फ़ाइलों के कारण), इस प्रकार यह यूआरआई से वास्तविक एक्सटेंशन लाने के लिए एक रॉक ठोस समाधान नहीं है यदि आप अनुमत फ़ाइल प्रकारों को सीमित करना चाहते हैं, यदि यह वही है जो आप जा रहे हैं निश्चित रूप से तो, मुझे लगता है कि आप सिर्फ यह जानना चाहते हैं कि फ़ाइल के यूआरआई पर आधारित कौन सा एक्सटेंशन है, भले ही यह पूरी तरह भरोसेमंद न हो;

आप विधि bellow का उपयोग कर किसी भी यूआरआई, यूआरएल या फ़ाइल पथ से एक्सटेंशन प्राप्त कर सकते हैं। आपको किसी पुस्तकालय या एक्सटेंशन का उपयोग करने की आवश्यकता नहीं है, क्योंकि यह मूल जावा कार्यक्षमता है। यह समाधान 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 विस्तार, ध्यान दें जाएगा विस्तार में है कि एक . (अवधि) शामिल है अगर आप एक उपसर्ग अवधि के बिना फाइल एक्सटेंशन इकट्ठा करना चाहते हैं , एक-एक करके सबस्ट्रिंग सूचकांक में वृद्धि इस तरह:

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

आप एक और अधिक मजबूत प्रणाली बनाने के लिए कार्यात्मक रूप में सुधार करने के आगे भी कर सकते हैं। दो उदाहरण हो सकता है:

  • मान्य यूआरआई को चेक करके उसे मौजूद है, या यकीन है कि यूआरआई के वाक्यविन्यास मान्य है, संभवतः एक नियमित अभिव्यक्ति का उपयोग कर बनाने के द्वारा।
  • अवांछित सफेद रिक्त स्थान को हटाने के लिए एक्सटेंशन को ट्रिम करें।

मैं यहां इन दो विशेषताओं के समाधानों को शामिल नहीं करूंगा, क्योंकि यह पहले स्थान पर नहीं पूछा जा रहा था।

आशा है कि इससे मदद मिलती है!

+9

यह काम नहीं करेगा अगर यूआरएल के पास फ़ाइल नाम या हैश के बाद कोई प्रश्न चिह्न है। –

+0

उस अवधि के चरित्र जो आपने जोड़े हैं, वह कुछ भी उपयोगी नहीं करता है, क्योंकि शीर्ष स्तर डोमेन से पहले की अवधि पहले भी होती है। –

12

इसके दो जवाब हैं।

यदि किसी यूआरआई में "फ़ाइल एक्सटेंशन" नहीं है, तो ऐसा कोई तरीका नहीं है कि आप इसे टेक्स्ट को देखकर या File में परिवर्तित करके इसका अनुमान लगा सकें। आम तौर पर, न तो यूआरआई या फ़ाइल को एक एक्सटेंशन होना चाहिए। एक्सटेंशन सिर्फ सम्मेलन नामकरण फ़ाइल है।

आप वास्तव में मीडिया प्रकार/MIMEtype/सामग्री प्रकार के फ़ाइल के बाद क्या हैं। आप कुछ इस तरह करने से मीडिया प्रकार का निर्धारण करने में सक्षम हो सकता है:

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

हालांकि getContentType() विधि null वापस आ जाएगी, तो जवाब में सर्वर किसी सामग्री प्रकार निर्धारित नहीं की। (या यह आपको गलत सामग्री प्रकार, या एक गैर विशिष्ट सामग्री प्रकार दे सकता है।) उस बिंदु पर, आपको सामग्री प्रकार "अनुमान लगाने" का सहारा लेना होगा, और मुझे नहीं पता कि इससे आपको पर्याप्त विशिष्टता मिल जाएगी या नहीं इस मामले में टाइप करें।

लेकिन यदि आप "जानते हैं" फ़ाइल ओडब्लूएल होना चाहिए, तो आप इसे अभी भी ".owl" एक्सटेंशन क्यों नहीं देते?

5

URLConnection.guessContentTypeFromName(url) माइम प्रकार को पहले उत्तर में वितरित करेगा। हो सकता है कि आप बस चाहता था:

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

नियमित अभिव्यक्ति पिछले स्लैश तक के सभी लेने वाली है, तो एक अवधि तक और या तो ".owl" या "" की तरह एक विस्तार देता है। (गलत नहीं हैं)

+1

"$ 1" का अर्थ क्या होगा ?? कृपया समझाएं ... – artapart

+1

@JavaRocks - javadocs पढ़ें :-) –

+0

URLConnection.guessContentTypeFromName (पता) // (स्ट्रिंग पता) सबसे अच्छा जवाब imho है। –

5

इस कड़ी जो लोग अभी भी समस्या हो रहे हैं के लिए मदद कर सकता है: How I can get the mime type of a file having its 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; 
} 
+0

मेरे लिए काम नहीं कर रहा है –

0

मैं इस तरह से यह कर रहा हूं।

आप अधिक के सत्यापन में कोई फाइल एक्सटेंशन की जाँच कर सकते हैं:

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

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

         // do anything 

        } else { 

         // invalid file 

        } 
1

के रूप में अन्य उत्तर समझा दिया है, तुम सच में फ़ाइल निरीक्षण के बिना सामग्री प्रकार पता नहीं है। हालांकि, आप एक यूआरएल से फ़ाइल प्रकार की भविष्यवाणी कर सकते हैं।

जावा लगभग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 = "https://stackoverflow.com/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/."))); 
संबंधित मुद्दे