我需要在node.js的帮助下获取word文件的文件类型以设置内容类型。我知道我可以轻松检查文件扩展名,但是在该项目中它不适用于我,因此我需要找到另一种解决方案来识别仅由Microsoft Office创建的Word文件,而无需手动更改扩展名。
答案 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
对于问题的第二部分,如果要确保它是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)
})();