1. وصف المشكلة
أثناء تطوير المشروع ، غالبًا ما نواجه مشكلة في تحميل الملفات ، وهو تنسيق الصورة للحصول عليه. في كثير من الحالات ، يستخدم الكثير من الناس اسم لاحقة للحكم ، كما هو موضح أدناه.
if (filename.endswith (". png") || filename.endswith (".ومع ذلك ، هذه الطريقة غير موثوقة للغاية. يمكننا محاولة تحميل ملف zip أو ملف RMVB أو CSS أو JS لتعديل اسم اللاحقة JPG أو PNG ، أو تحميله على الخادم ، مما يؤدي إلى ظهور البيانات القذرة على الخادم الخاص بنا. بالإضافة إلى ذلك ، بالنسبة لبعض ملفات الصور ، إذا تم تعديلها إلى الامتداد الخاطئ ، فقد لا تتمكن بعض المتصفحات من عرض الصورة.
2. الحل
في أنظمة الكمبيوتر ، تنتمي ملفات نوع الوسائط [معرفات] ، والرمز البريدي والصور نفسها تنتمي إلى ملفات الوسائط ، حتى نتمكن من تحديد ما إذا كانت الصور قانونية من خلال الترميز وفك التشفير.
1. طريقة الحكم والعلامة
isBMP الثابتة الثابتة الخاصة (byte [] buf) {byte [] markbuf = "bm" .getBytes () ؛ // أول بايتان من إرجاع ملف صورة BMP (BUF ، MarkBuf) ؛ } private static boolean isicon (byte [] buf) {byte [] markbuf = {0 ، 0 ، 1 ، 0 ، 1 ، 0 ، 32 ، 32} ؛ عودة مقارنة (buf ، markbuf) ؛ } private static boolean isWebp (byte [] buf) {byte [] markbuf = "riff" .getBytes () ؛ // WebP Image Imageier Return Compare (BUF ، MarkBuf) ؛ } isgif isgif (byte [] buf) {byte [] markbuf = "gif89a" .getBytes () ؛ // معرف GIF if (مقارنة (buf ، markbuf)) {return true ؛ } markbuf = "gif87a" .getBytes () ؛ // معرف GIF if (مقارنة (buf ، markbuf)) {return true ؛ } إرجاع خطأ ؛ } ispng static ispng (byte [] buf) {byte [] markbuf = {(byte) 0x89،0x50،0x4e ، 0x47،0x0d ، 0x0a ، 0x1a ، 0x0a} ؛ // PNG Identifier // New String (BUF) .indexof ("PNG")> 0 // يمكن أيضًا استخدام هذه الطريقة لإرجاع المقارنة (BUF ، MarkBuf) ؛ } isjpegheader static isjpegheader (byte [] buf) {byte [] markbuf = {(byte) 0xff ، (byte) 0xd8} ؛ // jpeg start character return compare (buf ، markbuf) ؛ } isjpegfooter isjpegfooter الثابتة الثابتة (byte [] buf) // jpeg ending inding {byte [] markbuf = {(byte) 0xff ، (byte) 0xd9} ؛ عودة مقارنة (buf ، markbuf) ؛ }2. الأساليب الأساسية
/ ** * احصل على mimetype من filename * param * return */ سلسلة ثابتة getMimetype (اسم ملف السلسلة) {try {string mimetype = endtype (filename) ؛ return string.format ("Image/٪ s" ، mimetype) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ } / ** * اقرأ نوع الملف * param filename * return * throws ioException * / private static string readtype (string filename) يلقي ioException {fileInputStream fis = null ؛ حاول {file f = file new (filename) ؛ if (! f.exists () || f.isdirectory () || f.length () <8) {رمي iOexception جديد ("الملف [+f.getabsolutepath ()+"] ليس صورة! ") ؛ } fis = new FileInputStream (f) ؛ byte [] bufheaders = readInputStreamat (fis ، 0،8) ؛ if (isJpeGheader (bufheaders)) {long skiplength = f.length ()-2-8 ؛ // في المرة الأولى التي قرأت فيها 8 بايت ، لذلك أحتاج إلى طرح البايت [] Buffooters = readInputStreamat (fis ، skiplength ، 2) ؛ if (isJpegFooter (buffooters)) {return "jpeg" ؛ }} if (isPng (bufheaders)) {return "png" ؛ } if (isGif (bufheaders)) {return "gif" ؛ } if (isWebp (bufheaders)) {return "webp" ؛ } if (ISBMP (bufheaders)) {return "bmp" ؛ } if (isicon (bufheaders)) {return "ICO" ؛ } رمي ioException جديد ("تنسيق الصورة غير ملامق!") ؛ } catch (fileNotFoundException e) {throw e ؛ } أخيرًا {try {if (fis! = null) fis.close () ؛ } catch (استثناء e) {}}} / *** mark comparison comparison* param buf mark ليتم اكتشافه* param markbuf editifier byte array* @return return false mark sign miskatch* / private static boolean compare (byte [] buf ، byte [] markbuf) {int i = 0 ؛ i markbuf Markbuf [i] ؛ البايت A = buf [i] ؛ if (a! = b) {return false ؛ }} إرجاع صحيح ؛ } / **** @param fis كائن دفق الإدخال* param skiplength طول موضع skip* طول param طول لقراءة* @return byte array* throws ioException* / private static byte [] readInputStreamat (fileInputStream fis ، long skiplength ، int int) throws ioxpection {] fis.skip (skiplength) ؛ // int read = fis.read (buf ، 0 ، engle) ؛ إرجاع buf ؛ }3. رمز الاختبار
اختبار عادي
الفئة العامة ImageType {public static void main (string [] args) {string filename = "oschina.jpg" ؛ نوع السلسلة = getMimetype (اسم الملف) ؛ system.out.println (type) ؛ }} الإخراج
Image/JPEG
تعديل اختبار التمديد
① تعديل Oschina.jpeg إلى Oschina.png
②copy oschina.png لحذف التمديد
الفئة العامة ImageType {public static void main (string [] args) {string filename = "oschina.png" ؛ نوع السلسلة = getMimetype (اسم الملف) ؛ system.out.println (type) ؛ filename = "Oschina" ؛ اكتب = getMimetype (اسم الملف) ؛ system.out.println (type) ؛ }} الإخراج
Image/JPEG
Image/JPEG
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.