java अपलोड की गई फाइल को कैसे जांचें कि यह एक छवि या अन्य फाइल है?




image servlets (3)

मेरे वेब एप्लिकेशन में मेरे पास एक छवि अपलोडिंग मॉड्यूल है। मैं अपलोड की गई फाइल को देखना चाहता हूं चाहे वह एक छवि फ़ाइल या कोई अन्य फाइल हो। मैं जावा पक्ष में जावा का उपयोग कर रहा हूँ।

छवि जावा में BufferedImage रूप में पढ़ी जाती है और फिर मैं इसे ImageIO.write() साथ डिस्क पर लिख रहा हूं

मैं BufferedImage जांच कैसे करूं, भले ही यह वास्तव में एक छवि या कुछ और हो?

किसी भी सुझाव या लिंक की सराहना की जाएगी।


मुझे लगता है कि आप इसे सर्वलेट संदर्भ में चला रहे हैं। यदि फ़ाइल एक्सटेंशन के आधार पर सामग्री प्रकार की जांच करना उचित है, तो माइम प्रकार (सामग्री प्रकार) प्राप्त करने के लिए ServletContext#getMimeType() का उपयोग करें। बस जांचें कि यह image/ शुरू होता है image/

String fileName = uploadedFile.getFileName();
String mimeType = getServletContext().getMimeType(fileName);
if (mimeType.startsWith("image/")) {
    // It's an image.
}

प्रश्न में servletcontainer के web.xml में डिफ़ॉल्ट माइम प्रकार निश्चित हैं। उदाहरण के लिए /conf/web.xml , यह /conf/web.xml में स्थित है। आप इसे अपने /WEB-INF/web.xml के /WEB-INF/web.xml में निम्नानुसार बढ़ा सकते हैं / ओवरराइड कर सकते हैं:

<mime-mapping>
    <extension>svg</extension>
    <mime-type>image/svg+xml</mime-type>
</mime-mapping>

लेकिन यह उन उपयोगकर्ताओं से आपको नहीं रोकता है जो फ़ाइल एक्सटेंशन को बदलकर आपको बेवकूफ बना रहे हैं। यदि आप इसे भी कवर करना चाहते हैं, तो आप वास्तविक फ़ाइल सामग्री के आधार पर माइम प्रकार भी निर्धारित कर सकते हैं। यदि केवल बीएमपी, जीआईएफ, जेपीजी या पीएनजी प्रकारों की जांच करना सस्ती है (लेकिन टीआईएफ, PSD, एसवीजी, आदि नहीं), तो आप इसे सीधे ImageIO#read() खिला सकते ImageIO#read() और जांच सकते हैं कि यह अपवाद नहीं फेंकता है या नहीं ।

try (InputStream input = uploadedFile.getInputStream()) {
    try {
        ImageIO.read(input).toString();
        // It's an image (only BMP, GIF, JPG and PNG are recognized).
    } catch (Exception e) {
        // It's not an image.
    }
}

लेकिन यदि आप अधिक छवि प्रकारों को भी कवर करना चाहते हैं, तो एक तृतीय पक्ष लाइब्रेरी का उपयोग करने पर विचार करें जो फ़ाइल हेडर को स्नीफ करके सभी काम करता है। उदाहरण के लिए JMimeMagic या अपाचे टिका जो बीएमपी, जीआईएफ, जेपीजी, पीएनजी, टीआईएफ और PSD दोनों (लेकिन एसवीजी नहीं) का समर्थन करते हैं। अपाचे बटिक एसवीजी का समर्थन करता है। उदाहरण के नीचे JMimeMagic का उपयोग करता है:

try (InputStream input = uploadedFile.getInputStream()) {
    String mimeType = Magic.getMagicMatch(input, false).getMimeType();
    if (mimeType.startsWith("image/")) {
        // It's an image.
    } else {
        // It's not an image.
    }
}

यदि आवश्यक हो तो आप संयोजनों का उपयोग कर सकते हैं और एक और दूसरे से अधिक हो सकते हैं।

उस ने कहा, अपलोड छवि को डिस्क पर सहेजने के लिए आपको ImageIO#write() आवश्यकता नहीं है। केवल InputStream Path को सीधे Path या किसी OutputStream जैसे FileOutputStream पर लिखना सामान्य जावा आईओ तरीका पर्याप्त से अधिक है ( एक सर्वलेट एप्लिकेशन में अपलोड की गई फ़ाइलों को सहेजने के लिए अनुशंसित तरीका भी देखें):

try (InputStream input = uploadedFile.getInputStream()) {
    Files.copy(input, new File(uploadFolder, fileName).toPath());
}

जब तक कि आप कुछ छवियों की जानकारी जैसे आयामों को इकट्ठा करना चाहते हैं और / या पाठ्यक्रम (फसल / आकार / घुमाने / घुमाव / कन्वर्ट / आदि) में हेरफेर करना चाहते हैं।


मैंने org.apache.commons.imaging.Imaging का उपयोग किया। मेरे मामले में org.apache.commons.imaging.Imaging । नीचे एक छवि का एक नमूना टुकड़ा है यह जांचने के लिए कि कोई छवि एक जेपीईजी छवि है या नहीं। अगर अपलोड की गई फाइल एक छवि नहीं है तो यह ImageReadException फेंकता है।

    try {
        //image is InputStream
        byte[] byteArray = IOUtils.toByteArray(image);
        ImageFormat mimeType = Imaging.guessFormat(byteArray);
        if (mimeType == ImageFormats.JPEG) {
            return;
        } else {
            // handle image of different format. Ex: PNG
        }
    } catch (ImageReadException e) {
        //not an image
    }

यह जेडीके में बनाया गया है और इसके लिए समर्थन के साथ बस एक स्ट्रीम की आवश्यकता है

byte[] data = ;
InputStream is = new BufferedInputStream(new ByteArrayInputStream(data));
String mimeType = URLConnection.guessContentTypeFromStream(is);
//...close stream




bufferedimage