code snippet to detect file type in vanilla javascript
// Example object mapping MIME types to magic numbers and extensions const mimeTypesData = { 'image/jpeg': { magicNumbers: [0xFF, 0xD8], extension: '.jpg', }, 'image/png': { magicNumbers: [0x89, 0x50], extension: '.png', }, 'image/gif': { magicNumbers: [0x47, 0x49, 0x46], extension: '.gif', }, 'image/bmp': { magicNumbers: [0x42, 0x4D], extension: '.bmp', }, 'image/tiff': { magicNumbers: [0x49, 0x49, 0x2A, 0x00], extension: '.tiff', }, 'image/webp': { magicNumbers: [0x52, 0x49, 0x46, 0x46, null, null, null, null, 0x57, 0x45, 0x42, 0x50], extension: '.webp', }, 'image/svg+xml': { magicNumbers: [0x3C, 0x3F, 0x78, 0x6D, 0x6C], extension: '.svg', }, 'image/x-icon': { magicNumbers: [0x00, 0x00, 0x01, 0x00], extension: '.ico', }, 'image/heif': { magicNumbers: [0x00, 0x00, 0x00, 0x14, 0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63], extension: '.heif', }, 'image/x-raw': { magicNumbers: [0x49, 0x49, 0x2A, 0x00], extension: '.raw', }, 'video/mp4': { magicNumbers: [0x66, 0x74, 0x79, 0x70, 0x33, 0x67, 0x70, 0x34], extension: '.mp4', }, 'video/webm': { magicNumbers: [0x1A, 0x45, 0xDF, 0xA3], extension: '.webm', }, 'video/avi': { magicNumbers: [0x52, 0x49, 0x46, 0x46, null, null, null, null, 0x41, 0x56, 0x49, 0x20], extension: '.avi', }, 'video/x-matroska': { magicNumbers: [0x1A, 0x45, 0xDF, 0xA3], extension: '.mkv', }, 'video/quicktime': { magicNumbers: [0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32], extension: '.mov', }, 'video/x-ms-wmv': { magicNumbers: [0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA], extension: '.wmv', }, 'video/x-flv': { magicNumbers: [0x46, 0x4C, 0x56, 0x01], extension: '.flv', }, 'video/3gpp': { magicNumbers: [0x66, 0x74, 0x79, 0x70, 0x33, 0x67, 0x70], extension: '.3gp', }, 'video/mpeg': { magicNumbers: [0x00, 0x00, 0x01, 0xBA], extension: '.mpeg', }, 'video/ogg': { magicNumbers: [0x4F, 0x67, 0x67, 0x53], extension: '.ogg', }, 'video/vob': { magicNumbers: [0x00, 0x00, 0x01, 0xBA], extension: '.vob', }, 'video/x-m4v': { magicNumbers: [0x00, 0x00, 0x00, 0x1C, 0x66, 0x74, 0x79, 0x70, 0x4D, 0x34, 0x56], extension: '.m4v', }, 'application/x-shockwave-flash': { magicNumbers: [0x43, 0x57, 0x53], extension: '.swf', }, }; // ... (MIME types and magic numbers data) // Function to determine the file extension from a file buffer function getFileExtensionFromBuffer(fileBuffer) { // Ensure fileBuffer is a Uint8Array (arrayBuffer() result) if (!(fileBuffer instanceof Uint8Array)) { throw new Error('fileBuffer is not a Uint8Array'); } // Get the first few bytes from the buffer const firstBytes = Array.from(fileBuffer.slice(0, 8)); // Check up to 12 bytes // Check if the first bytes match any known magic numbers for (const mimeType in mimeTypesData) { const mimeTypeData = mimeTypesData[mimeType]; const magicBytes = mimeTypeData.magicNumbers; if (magicBytes.every((value, index) => (value === null ? true : value === firstBytes[index]))) { return mimeTypeData.extension; } } // If no known magic numbers match, return a default extension return '.bin'; // Default to binary data if unknown } export default { async fetch(request, env) { try { const url = new URL(request.url); const key = url.pathname.slice(1); switch (request.method) { case 'POST': const fileBuffer = new Uint8Array(await request.arrayBuffer()); return new Response(JSON.stringify({ // typeof: typeof fileBuffer,// // fileBuffer, filename123: `${crypto.randomUUID()}${getFileExtensionFromBuffer(fileBuffer)}`, })); // ... (other cases) default: return new Response('Method Not Allowed', { status: 405, headers: { Allow: 'PUT, GET, DELETE', }, }); } } catch (e) { return new Response(JSON.stringify(e.stack || e), { status: 400, }); } }, };