1. คำอธิบายปัญหา
ในระหว่างการพัฒนาโครงการเรามักจะพบปัญหาของการอัปโหลดไฟล์ซึ่งเป็นรูปแบบของภาพที่จะได้รับ ในหลายกรณีหลายคนใช้ชื่อต่อท้ายเพื่อตัดสินดังที่แสดงด้านล่าง
if (filename.endswith (". png") || filename.endswith (". jpg")) {// บันทึกรูปภาพ}} {โยน ioexception ใหม่ ("รูปแบบไฟล์ข้อผิดพลาด!");};อย่างไรก็ตามวิธีนี้ค่อนข้างไม่น่าเชื่อถือ เราสามารถลองอัปโหลดไฟล์ ZIP, ไฟล์ RMVB, CSS, JS เพื่อแก้ไขชื่อคำต่อท้าย JPG หรือ PNG หรืออัปโหลดไปยังเซิร์ฟเวอร์ซึ่งทำให้ข้อมูลสกปรกปรากฏบนเซิร์ฟเวอร์ของเรา นอกจากนี้สำหรับไฟล์รูปภาพบางไฟล์หากมีการแก้ไขเป็นส่วนขยายที่ไม่ถูกต้องเบราว์เซอร์บางตัวอาจไม่สามารถแสดงภาพได้
2. โซลูชัน
ในระบบคอมพิวเตอร์ไฟล์ประเภทสื่อมี [ตัวระบุ] และซิปและรูปภาพเป็นของไฟล์สื่อดังนั้นเราจึงสามารถพิจารณาได้ว่ารูปภาพนั้นถูกกฎหมายผ่านการเข้ารหัสและการถอดรหัส
1. วิธีการตัดสินและทำเครื่องหมาย
บูลีนแบบคงที่ส่วนตัว ISBMP (ไบต์ [] buf) {byte [] markbuf = "bm" .getBytes (); // สองไบต์แรกของไฟล์ภาพ BMP Return Compare (buf, markbuf); } บูลีนแบบคงที่ส่วนตัว isicon (byte [] buf) {byte [] markbuf = {0, 0, 1, 0, 1, 0, 0, 32, 32}; Return Compare (buf, markbuf); } บูลีนแบบคงที่ส่วนตัว iswebp (byte [] buf) {byte [] markbuf = "riff" .getBytes (); // Webp Image Identifier Return Compare (BUF, MarkBuf); } บูลีนแบบคงที่ส่วนตัว isgif (byte [] buf) {byte [] markbuf = "gif89a" .getBytes (); // ตัวระบุ GIF ถ้า (เปรียบเทียบ (buf, markbuf)) {return true; } markBuf = "gif87a" .getBytes (); // ตัวระบุ GIF ถ้า (เปรียบเทียบ (buf, markbuf)) {return true; } return false; } บูลีนแบบคงที่ส่วนตัว ispng (byte [] buf) {byte [] markbuf = {(ไบต์) 0x89,0x50,0x4e, 0x47,0x0d, 0x0a, 0x1a, 0x0a}; // png identifier // สตริงใหม่ (buf) .indexof ("png")> 0 // วิธีนี้สามารถใช้เพื่อส่งคืนเปรียบเทียบ (buf, markbuf); } บูลีนแบบคงที่ส่วนตัว isjpegheader (byte [] buf) {byte [] markbuf = {(byte) 0xff, (byte) 0xd8}; // jpeg อักขระเริ่มต้นเปรียบเทียบ (buf, markbuf); } private boolean private boolean isjpegfooter (byte [] buf) // jpeg อักขระสิ้นสุด {byte [] markbuf = {(ไบต์) 0xff, (ไบต์) 0xd9}; Return Compare (buf, markbuf); -2. วิธีหลัก
/ ** * รับ mimetype ของไฟล์ * @param filename * @return */ สตริงคงที่ส่วนตัว getMimeType (ชื่อไฟล์สตริง) {ลอง {สตริง mimetype = readType (ชื่อไฟล์); return string.format ("image/%s", mimetype); } catch (ioexception e) {e.printstacktrace (); } return null; } / ** * อ่านประเภทไฟล์ * @param filename * @return * @throws ioexception * / สตริงคงที่ส่วนตัว readType (ชื่อสตริงไฟล์) พ่น IOException {fileInputStream fis = null; ลอง {ไฟล์ f = ไฟล์ใหม่ (ชื่อไฟล์); if (! f.exists () || f.isdirectory () || f.length () <8) {โยน iOexception ใหม่ ("ไฟล์ ["+f.getabsolutepath ()+"] ไม่ใช่ภาพ!"); } FIS = ใหม่ FileInputStream (F); ไบต์ [] bufheaders = readinputstreamat (fis, 0,8); if (isjpegheader (bufheaders)) {ยาว 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) {โยน e; } ในที่สุด {ลอง {ถ้า (fis! = null) fis.close (); } catch (Exception E) {}}} / *** การเปรียบเทียบความสอดคล้องของเครื่องหมาย* @param buf mark ที่จะตรวจพบ* @param markbuf identifier byte array* @return return mark เครื่องหมายเท็จ mismatch* / private static boolean เปรียบเทียบ (byte [] buf, byte [] Markbuf [i]; ไบต์ a = buf [i]; if (a! = b) {return false; }} ส่งคืนจริง; } / **** @param fis อินพุตสตรีมวัตถุ* @param skiplength ความยาวตำแหน่งความยาว* @param ความยาวความยาวในการอ่าน* @return byte array* @throws ioexception* / ไบต์คงที่ส่วนตัว [] readInputStreamat fis.skip (skiplength); // int read = fis.read (buf, 0, ความยาว); กลับ buf; -3. รหัสทดสอบ
การทดสอบปกติ
คลาสสาธารณะ imageType {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สตริง filename = "oschina.jpg"; ประเภทสตริง = getMimeType (ชื่อไฟล์); System.out.println (ประเภท); - เอาท์พุท
รูปภาพ/jpeg
แก้ไขการทดสอบส่วนขยาย
①แก้ไข oschina.jpeg เป็น oschina.png
②Copy Oschina.png เพื่อลบส่วนขยาย
คลาสสาธารณะ imageType {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สตริง filename = "oschina.png"; ประเภทสตริง = getMimeType (ชื่อไฟล์); System.out.println (ประเภท); filename = "oschina"; type = getMimeType (ชื่อไฟล์); System.out.println (ประเภท); - เอาท์พุท
รูปภาพ/jpeg
รูปภาพ/jpeg
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น