Node.js-文件系统获取单词类型仅由Microsoft Word Office创建

时间:2019-02-19 16:14:28

标签: sql node.js express

我需要在node.js的帮助下获取word文件的文件类型以设置内容类型。我知道我可以轻松检查文件扩展名,但是在该项目中它不适用于我,因此我需要找到另一种解决方案来识别仅由Microsoft Office创建的Word文件,而无需手动更改扩展名。

1 个答案:

答案 0 :(得分:2)

您可以使用MIME type来检测magic numbers,也可以只使用npm library,它不仅支持Word文档(docx,pdf ...),还支持多种类型。

或者您可以使用类似这样的东西:

    const uploads = []
    const fileSelector = document.getElementById('file-selector')
    fileSelector.addEventListener('change', (event) => {
        console.time('FileOpen')
        const file = event.target.files[0]
        const filereader = new FileReader()
        filereader.onloadend = function(evt) {
            if (evt.target.readyState === FileReader.DONE) {
                const uint = new Uint8Array(evt.target.result)
                let bytes = []
                uint.forEach((byte) => {
                    bytes.push(byte.toString(16))
                })
                const hex = bytes.join('').toUpperCase()
                uploads.push({
                    filename: file.name,
                    filetype: file.type ? file.type : 'Unknown/Extension missing',
                    binaryFileType: getMimetype(hex),
                    hex: hex
                })
                render()
            }
            console.timeEnd('FileOpen')
        }
        const blob = file.slice(0, 4);
        filereader.readAsArrayBuffer(blob);
    })
    const render = () => {
        const container = document.getElementById('files')
        const uploadedFiles = uploads.map((file) => {
            return `<div>
                    <strong>${file.filename}</strong><br>
                    Filetype from file object: ${file.filetype}<br>
                    Filetype from binary: ${file.binaryFileType}<br>
                    Hex: <em>${file.hex}</em>
                    </div>`
        })
        container.innerHTML = uploadedFiles.join('')
    }
    const getMimetype = (signature) => {
        switch (signature) {
            case '89504E47':
                return 'image/png'
            case '47494638':
                return 'image/gif'
            case '25504446':
                return 'application/pdf'
            case 'FFD8FFDB':
            case 'FFD8FFE0':
                return 'image/jpeg'
            case '504B0304':
                return 'application/zip'
            default:
                return 'Unknown filetype'
        }
    }

这个想法只是取文件file.slice(0, 4)的前4个字节 ,然后使用Switch

得出其MIME类型
  

如果要确保它是Microsoft Word文件,只需切片8个字节并检查其是否为50 4B 03 04 14 00 06 00

对于问题的第二部分,

附加,关于如何在nodejs中使用document.getElementById(),我建议使用Puppeteer

  

Puppeteer是一个节点库,它提供了高级API来通过DevTools协议控制无头Chrome或Chromium。也可以将其配置为使用完整(无头)的Chrome或Chromium。

示例:

const puppeteer = require('puppeteer');
(async () => {
    const browser = await puppeteer.launch();
        page = await browser.newPage();
        await page.goto('http://example.com/page.html', {waitUntil: 'load'});
    const newPage = await page.evaluate(() => {
        return  document.getElementById("id_u_want").innerHTML;
        });
     console.log(newPage)
  })();