ฉันพบข้อกำหนด: สมมติว่ามีไฟล์รูปภาพที่มีประเภท JPG จริงและมีคนขี้เกียจคัดลอก JPG โดยตรงและบันทึกเป็นไฟล์ PNG ที่มีชื่อเดียวกัน ด้วยวิธีนี้จะไม่มีปัญหาเมื่ออ่านไฟล์ AS3 แต่โทรศัพท์มือถือ C ++ พบปัญหาเมื่ออ่านไฟล์ - -!
ตอนนี้คุณต้องเขียนโปรแกรมเพื่อสำรวจไฟล์ทั้งหมดในโฟลเดอร์และค้นหาไฟล์ที่มีรูปแบบไฟล์ "ผิดปกติ" ทรัพยากรของเราส่วนใหญ่คือ GIF, PNG และ JPG ในตอนต้นฉันพบบทความออนไลน์: รับประเภทไฟล์ประเภท MIME ตามสตรีมไบนารีและส่วนหัวไฟล์จากนั้นอ่านข้อมูลส่วนหัวของไฟล์ไบนารีไฟล์รับประเภทไฟล์จริงและเปรียบเทียบกับประเภทไฟล์ที่ได้รับผ่านชื่อต่อท้าย
การคัดลอกรหัสมีดังนี้:
var fd = fs.opensync (new_file_path, 'r');
var buffer = บัฟเฟอร์ใหม่ (8);
var minetype = mime.lookup (new_file_path);
var fileType = mime.extension (minetype);
fs.readsync (fd, บัฟเฟอร์, 0, 8, 0);
var newBuf = buffer.slice (0, 4);
var head_1 = newBuf [0] .tostring (16);
var head_2 = newBuf [1] .tostring (16);
var head_3 = newBuf [2] .tostring (16);
var head_4 = newBuf [3] .tostring (16);
var head_iden = head_1 + head_2;
var tempfileType = file_type_config [head_iden];
if (! tempfileType) {
head_iden += head_3;
tempFileType = file_type_config [head_iden];
if (! tempfileType) {
var msg = "unknow fileType" + new_file_path + '-' + fileType;
showlog (ผงชูรส);
ดำเนินการต่อ;
-
-
if (tempFileType! = fileType) {
var msg = "ข้อผิดพลาด fileType" + new_file_path + '-' + fileType + '|' + tempFileType + '-รูปแบบไฟล์ภาพที่ถูกต้อง';
showlog (ผงชูรส);
g_errorfileTyparr.push (msg);
-
หลังจากนั้นเมื่อค้นหาข้อมูลที่เกี่ยวข้องกับภาพโหนดฉันพบบทความนี้: การจัดอันดับโมดูล node.js >> (รูปภาพ)
จากนั้นกรองโมดูล "node-imageInfo" และเขียนตัวอย่างสำหรับการทดสอบ (จงใจแก้ไขชื่อต่อท้ายของไฟล์ JPG โดยตรงไปยัง PNG):
ซอร์สโค้ดหากคุณสนใจคุณสามารถศึกษาได้:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น readuint32 (บัฟเฟอร์, ออฟเซ็ต, บิ๊กเรียน) {
if (buffer.readuint32) {
return buffer.readuint32 (ชดเชย, Bigendian);
-
ค่า var;
ถ้า (Bigendian) {
if (buffer.readuint32be) {
return buffer.readuint32be (ชดเชย);
-
value = (บัฟเฟอร์ [ออฟเซ็ต] << 24) + (บัฟเฟอร์ [ออฟเซ็ต + 1] << 16) + (บัฟเฟอร์ [ออฟเซ็ต + 2] << 8) + บัฟเฟอร์ [ออฟเซ็ต + 3];
-
อื่น {
if (buffer.readuint32le) {
return buffer.readuint32LE (ออฟเซ็ต);
-
ค่า = บัฟเฟอร์ [ออฟเซ็ต] + (บัฟเฟอร์ [ออฟเซ็ต + 1] << 8) + (บัฟเฟอร์ [ออฟเซ็ต + 2] << 16) + (บัฟเฟอร์ [ออฟเซ็ต + 3] << 24);
-
ค่าส่งคืน;
-
ฟังก์ชั่น readuint16 (บัฟเฟอร์, ออฟเซ็ต, บิ๊กเรียน) {
if (buffer.readuint16) {
return buffer.readuint16 (ชดเชย, Bigendian);
-
ค่า var;
ถ้า (Bigendian) {
if (buffer.readuint16be) {
return buffer.readuint16be (ชดเชย);
-
value = (บัฟเฟอร์ [ออฟเซ็ต] << 8) + บัฟเฟอร์ [ออฟเซ็ต + 1];
-
อื่น {
if (buffer.readuint16le) {
return buffer.readuint16le (ชดเชย);
-
value = buffer [Offset] + (บัฟเฟอร์ [Offset + 1] << 8);
-
ค่าส่งคืน;
-
ฟังก์ชั่น Readbit (บัฟเฟอร์, ออฟเซ็ต, bitoffset) {
if (bitoffset> 7) {
Offset += Math.floor (bitoffset / 8);
bitoffset = bitoffset % 8;
-
var b = บัฟเฟอร์ [ออฟเซ็ต];
if (bitoffset <7) {
b >>> = (7 - bitoffset);
-
var val = b & 0x01;
กลับมาวาล;
-
function readbits (บัฟเฟอร์, ออฟเซ็ต, bitoffset, bitlen, เซ็นชื่อ) {
var val = 0;
var neg = false;
ถ้า (ลงนาม) {
if (readbit (บัฟเฟอร์, ชดเชย, bitoffset)> 0) {
neg = true;
-
Bitlen--;
bitoffset ++;
-
var bytes = [];
สำหรับ (var i = 0; i <bitlen; i ++) {
var b = readbit (บัฟเฟอร์, ชดเชย, bitoffset + i);
if (i> 0 && (bitlen - i) % 8 == 0) {
Bytes.Push (Val);
val = 0;
-
Val << = 1;
Val | = B;
-
Bytes.Push (Val);
val = บัฟเฟอร์ใหม่ (ไบต์);
val.negative = neg? true: false;
กลับมาวาล;
-
ฟังก์ชั่น ImageInfopng (บัฟเฟอร์) {
var imageHeader = [0x49, 0x48, 0x44, 0x52]
pos = 12;
if (! checksig (บัฟเฟอร์, pos, imageheader)) {
กลับเท็จ;
-
pos += 4;
กลับ {
ประเภท: 'ภาพ',
รูปแบบ: 'png',
mimetype: 'image/png'
ความกว้าง: readuint32 (บัฟเฟอร์, pos, true),
ความสูง: readuint32 (บัฟเฟอร์, pos+4, true),
-
-
ฟังก์ชั่น imageinfojpg (บัฟเฟอร์) {
var pos = 2,
len = buffer.length,
SizesIg = [0xff, [0xc0, 0xc2]];
ในขณะที่ (pos <len) {
if (checksig (buffer, pos, sizesig)) {
pos += 5;
กลับ {
ประเภท: 'ภาพ',
รูปแบบ: 'jpg',
mimetype: 'image/jpeg'
ความกว้าง: readuint16 (บัฟเฟอร์, pos+2, true),
ความสูง: readuint16 (บัฟเฟอร์, pos, true),
-
-
pos += 2;
var size = readuint16 (บัฟเฟอร์, pos, true);
pos += ขนาด;
-
-
ฟังก์ชั่น ImageInfogif (บัฟเฟอร์) {
var pos = 6;
กลับ {
ประเภท: 'ภาพ',
รูปแบบ: 'gif',
mimetype: 'image/gif',
ความกว้าง: readuint16 (บัฟเฟอร์, pos, false),
ความสูง: readuint16 (บัฟเฟอร์, pos+2, false),
-
-
ฟังก์ชั่น ImageInfoswf (บัฟเฟอร์) {
var pos = 8
bitpos = 0,
วาล;
ถ้า (บัฟเฟอร์ [0] === 0x43) {
พยายาม {
// ถ้าคุณมี zlib (NPM ติดตั้ง zlib) เราสามารถอ่านไฟล์แฟลชที่บีบอัดได้
บัฟเฟอร์ = ต้องการ ('zlib'). พองตัว (buffer.slice (8, 100));
pos = 0;
-
จับ (อดีต) {
// ไม่สามารถรับความกว้าง/ความสูงของไฟล์แฟลชบีบอัดได้ ... ยัง (ต้องการ zlib)
กลับ {
ประเภท: 'แฟลช',
รูปแบบ: 'swf',
mimetype: 'แอปพลิเคชัน/x-shockwave-flash'
ความกว้าง: เป็นโมฆะ
ความสูง: เป็นโมฆะ
-
-
-
var numbits = readbits (บัฟเฟอร์, pos, bitpos, 5) [0];
bitpos += 5;
val = readbits (บัฟเฟอร์, pos, bitpos, numbits, true);
var xmin = (numbits> 9? readuint16 (val, 0, true): val [0]) * (val.negative? -1: 1);
bitpos += numbits;
val = readbits (บัฟเฟอร์, pos, bitpos, numbits, true);
var xmax = (numbits> 9? readuint16 (val, 0, true): val [0]) * (val.negative? -1: 1);
bitpos += numbits;
val = readbits (บัฟเฟอร์, pos, bitpos, numbits, true);
var ymin = (numbits> 9? readuint16 (val, 0, true): val [0]) * (val.negative? -1: 1);
bitpos += numbits;
val = readbits (บัฟเฟอร์, pos, bitpos, numbits, true);
var ymax = (numbits> 9? readuint16 (val, 0, true): val [0]) * (val.negative? -1: 1);
กลับ {
ประเภท: 'แฟลช',
รูปแบบ: 'swf',
mimetype: 'แอปพลิเคชัน/x-shockwave-flash'
ความกว้าง: Math.Ceil ((XMAX - XMIN) / 20)
ความสูง: Math.Ceil ((ymax - ymin) / 20)
-
-
การตรวจสอบฟังก์ชั่น (บัฟเฟอร์, ชดเชย, sig) {
var len = sig.length;
สำหรับ (var i = 0; i <len; i ++) {
var b = บัฟเฟอร์ [i+ออฟเซ็ต]
s = sig [i],
M = FALSE;
if ('number' == typeof s) {
m = s === b;
-
อื่น {
สำหรับ (var k in s) {
var o = s [k];
ถ้า (o === b) {
m = true;
-
-
-
ถ้า (! m) {
กลับเท็จ;
-
-
กลับมาจริง;
-
module.exports = function imageInfo (บัฟเฟอร์, พา ธ ) {
var pngsig = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
var jpgsig = [0xff, 0xd8, 0xff];
var gifsig = [0x47, 0x49, 0x46, 0x38, [0x37, 0x39], 0x61];
var swfsig = [[0x46, 0x43], 0x57, 0x53];
if (checksig (buffer, 0, pngsig)) return imageinfopng (บัฟเฟอร์);
if (checksig (buffer, 0, jpgsig)) ส่งคืน imageInfojpg (บัฟเฟอร์);
if (checksig (buffer, 0, gifsig)) return imageInfogif (บัฟเฟอร์);
if (checksig (buffer, 0, swfsig)) ส่งคืน imageInfoswf (บัฟเฟอร์);
กลับเท็จ;
-