node.js menyelesaikan masalah mendapatkan jenis fail sebenar images_node.js

WBOY
Lepaskan: 2016-05-16 16:25:21
asal
1410 orang telah melayarinya

Menghadapi keperluan: Katakan terdapat fail imej, jenis sebenar ialah jpg, dan seseorang terlalu malas untuk menyalin jpg secara terus dan menyimpannya sebagai fail png dengan nama yang sama, supaya tidak ada masalah apabila AS3 membaca fail tetapi telefon mudah alih C menghadapi masalah semasa membaca fail - -!

Kini anda perlu menulis program untuk melintasi fail dalam semua folder dan mencari fail dengan format fail "tidak normal". Sumber kami terutamanya gif, png dan jpg Pada mulanya, saya menjumpai artikel di Internet: Dapatkan jenis mime jenis fail berdasarkan strim binari dan pengepala fail, dan kemudian baca maklumat pengepala binari fail untuk mendapatkannya. jenis fail sebenar , bandingkan dengan jenis fail yang diperoleh melalui nama akhiran.

Salin kod Kod adalah seperti berikut:

var fd = fs.openSync(new_file_path, 'r');
var buffer = new Buffer(8);

var mineType = mime.lookup(new_file_path);
var fileType = mime.extension(mineType);

fs.readSync(fd, penimbal, 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];
jika (!tempFileType) {
kepala_iden = kepala_3;

tempFileType = FILE_TYPE_CONFIG[head_iden];

jika (!tempFileType) {
          var msg = "Unknow fileType " new_file_path '-' fileType;
         showLog(msg);
Teruskan;
}
}

jika (tempFileType != fileType) {
var msg = "Error fileType" new_file_path '-' fileType '|' tempFileType '--correct image file format';
ShowLog(msg);

g_errorFileTypArr.push(msg);
}

Kemudian, apabila saya mencari maklumat yang berkaitan dengan imej nod, saya menemui artikel ini: ranking modul node.js>> (imej)

Kemudian saya menapis modul "node-imageinfo" dan menulis contoh untuk ujian (sengaja menukar terus akhiran fail jpg kepada png):

Kod sumbernya, jika anda berminat, anda boleh mengkajinya:


Salin kod Kod adalah seperti berikut:

fungsi readUInt32(buffer, offset, bigEndian) {
    jika (buffer.readUInt32) {
        return buffer.readUInt32(offset, bigEndian);
    }

    nilai var;
    jika (bigEndian) {
        jika (buffer.readUInt32BE) {
            kembalikan penimbal.readUInt32BE(offset);
        }
        nilai = (penampan[offset] << 24) (penampan[offset 1] << 16) (penampan[offset 2] << 8) penimbal[offset 3];
    }
    lain {
        jika (buffer.readUInt32LE) {
            kembalikan penimbal.readUInt32LE(offset);
        }
        nilai = penimbal[offset] (penampan[offset 1] << 8) (penampan[offset 2] << 16) (penampan[offset 3] << 24);
    }
    nilai pulangan;
}

fungsi readUInt16(buffer, offset, bigEndian) {
    jika (buffer.readUInt16) {
        return buffer.readUInt16(offset, bigEndian);
    }

    nilai var;
    jika (bigEndian) {
        jika (buffer.readUInt16BE) {
            kembalikan penimbal.readUInt16BE(offset);
        }
        nilai = (penampan[offset] << 8) penimbal[offset 1];
    }
    lain {
        jika (buffer.readUInt16LE) {
            kembalikan penimbal.readUInt16LE(offset);
        }
        nilai = penimbal[offset] (penampan[offset 1] << 8);
    }
    nilai pulangan;
}

fungsi readBit(buffer, offset, bitOffset) {
    jika (bitOffset > 7) {
        offset = Math.floor(bitOffset / 8);
        bitOffset = bitOffset % 8;
    }

    var b = penimbal[offset];
    jika (bitOffset < 7) {
        b >>>= (7 - bitOffset);
    }

    var val = b & 0x01;
    pulangkan val;
}

fungsi readBits(buffer, offset, bitOffset, bitLen, signed) {
    var val = 0;
   
    var neg = palsu;
    jika (ditandatangani) {
        if (readBit(buffer, offset, bitOffset) > 0) {
            neg = benar;
        }
        bitLen--;
        bitOffset ;
    }

    var bait = [];
    untuk (var i = 0; i < bitLen; i ) {
        var b = readBit(buffer, offset, bitOffset i);
        jika (i>0 && (bitLen - i) % 8 == 0) {
            bytes.push(val);
            val = 0;
        }
        val <<= 1;
        val |= b;
    }
    bytes.push(val);

    val = Penampan baharu(bait);
    val.negative = neg?true:false;
    pulangkan val;
}

function imageInfoPng(buffer) {
    var imageHeader = [0x49, 0x48, 0x44, 0x52],
        pos = 12;

    jika (!checkSig(buffer, pos, imageHeader)) {
        pulangkan palsu;
    }

    pos = 4;
    kembali {
        taip: 'imej',
        format: 'PNG',
        mimeType: 'imej/png',
        lebar: readUInt32(penampan, pos, benar),
        ketinggian: readUInt32(penampan, pos 4, benar),
    };
}

function imageInfoJpg(buffer) {
    var pos = 2,
        len = penimbal.panjang,
        sizeSig = [0xff, [0xc0, 0xc2]];

    manakala (pos < len) {
        if (checkSig(buffer, pos, sizeSig)) {
            pos = 5;
            kembali {
                taip: 'imej',
                format: 'JPG',
                mimeType: 'imej/jpeg',
                lebar: readUInt16(penampan, pos 2, benar),
                ketinggian: readUInt16(penampan, pos, benar),
            };
        }

        pos = 2;
        saiz var = readUInt16(penampan, pos, benar);
        pos = saiz;
    }
}

function imageInfoGif(buffer) {
    var pos = 6;

    kembali {
        taip: 'imej',
        format: 'GIF',
        mimeType: 'imej/gif',
        lebar: readUInt16(penampan, pos, palsu),
        ketinggian: readUInt16(penampan, pos 2, palsu),
    };
}

function imageInfoSwf(buffer) {
    var pos = 8,
        bitPos = 0,
        val;

    jika (penampan[0] === 0x43) {
        cuba {
            // Jika anda mempunyai zlib tersedia ( npm install zlib ) maka kita boleh membaca fail kilat termampat
            penimbal = memerlukan('zlib').inflate(buffer.slice(8, 100));
            pos = 0;
        }
        tangkap (cth) {
            // Tidak boleh mendapatkan lebar/tinggi fail kilat termampat... lagi (perlu zlib)
            kembali {
                taip: 'flash',
                format: 'SWF',
                mimeType: 'application/x-shockwave-flash',
                lebar: null,
                ketinggian: null,
            }
        }
    }

    var numBits = readBits(buffer, pos, bitPos, 5)[0];
    bitPos = 5;
   
    val = readBits(buffer, pos, bitPos, numBits, true);
    var xMin = (numBits > 9 ? readUInt16(val, 0, true) : val[0]) * (val.negatif ? -1 : 1);
    bitPos = numBits;

    val = readBits(buffer, pos, bitPos, numBits, true);
    var xMax = (numBits > 9 ? readUInt16(val, 0, true) : val[0]) * (val.negatif ? -1 : 1);
    bitPos = numBits;

    val = readBits(buffer, pos, bitPos, numBits, true);
    var yMin = (numBits > 9 ? readUInt16(val, 0, true) : val[0]) * (val.negatif ? -1 : 1);
    bitPos = numBits;

    val = readBits(buffer, pos, bitPos, numBits, true);
    var yMax = (numBits > 9 ? readUInt16(val, 0, true) : val[0]) * (val.negatif ? -1 : 1);

    kembali {
        taip: 'flash',
        format: 'SWF',
        mimeType: 'application/x-shockwave-flash',
        lebar: Math.ceil((xMax - xMin) / 20),
        ketinggian: Math.ceil((yMax - yMin) / 20),
    };
}

fungsi checkSig(buffer, offset, sig) {
    var len = sig.length;
    untuk (var i = 0; i < len; i ) {
        var b = penimbal[i mengimbangi],
            s = sig[i],
            m = palsu;

        jika ('nombor' == jenis s) {
            m = s === b;
        }
        lain {
            untuk (var k dalam s) {
                var o = s[k];
                jika (o === b) {
                    m = benar;
                }
            }
        }

        jika (!m) {
            pulangkan palsu;
        }
    }

    kembali benar;
}

module.exports = function imageInfo(buffer, path) {
    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];

    jika (checkSig(buffer, 0, pngSig)) return imageInfoPng(buffer);
    if (checkSig(buffer, 0, jpgSig)) return imageInfoJpg(buffer);
    if (checkSig(buffer, 0, gifSig)) return imageInfoGif(buffer);
    if (checkSig(buffer, 0, swfSig)) return imageInfoSwf(buffer);

    kembali palsu;
};

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan