如何检查文件是否具有与其扩展名相同的类型

How to check if the file is having the same type as of its extension?

本文关键字:扩展名 类型 何检查 检查 是否 文件      更新时间:2023-09-26

我想构建检查文件类型的Javascript代码。在我创建的web应用程序中,允许用户上传文档文件viz, doc, xls, ppt, docx, xlsx, pptx, txt, rar, zip, pdf, jpg, png, gif, jpeg, odt,但不应该允许其他文件。我不能只检查文件名中的扩展名。用户可以更改它。

我试着检查内容类型,但它也每次都在改变。欢迎提出建议。

在"现代"浏览器(IE10+, Firefox 4+, Chrome 7+, Safari 6.0.2+等)中,可以使用File/FileReader API读取文件内容并在客户端解析它。例如(例如,不是生产代码):

var fileInput = /* Your <input type="file"> element */
fileInput.addEventListener("change", function(e) {
    var file = e.currentTarget.files[0];
    var reader = new FileReader();
    reader.onload = fileLoaded;
    reader.readAsArrayBuffer(file);
});
function fileLoaded(e)
{
   var arrayBuffer = e.currentTarget.result;
   // 32 indicates that we just want a look at the first 32 bytes of the buffer.
   // If we don't specify a length, we get the entire buffer.
   var bytes = new Uint8Array(arrayBuffer, 0, 32);
   // Now we can check the content, comparing to whatever file signatures we
   // have, e.g.:
   if (bytes[0] == 0x50 &&
       bytes[1] == 0x4b &&
       bytes[2] == 0x03 &&
       bytes[3] == 0x04)
   {
      // This is most likely docx, xlsx, pptx or other zip file.
   }
}
http://jsfiddle.net/35XfG/

但是,请注意,例如,.zip中没有开头的50 4b 03 04。因此,除非您花费相当多的时间查看不同的文件签名(或者找到一些已经这样做的库),否则您很可能会拒绝实际上可能有效的文件。当然,它也有可能给出假阳性。 在这种情况下,

误报并不重要,因为这只是作为一种用户友好的措施来检查用户上传的文件是否会被服务器拒绝。服务器应该始终验证最终发送的内容。

当然,读取整个文件来查看前几个字节也不是那么有效。:-)参考Ray Nicholus的评论

除非您可以实际解析内容并通过结果判断文件是否属于某种类型,否则我不认为使用纯JS做这件事的好方法。您可能需要考虑暂时将文件上传到服务器,然后在服务器上执行检查。unix文件命令是一个非常有用的工具。它不依赖于文件扩展名,而是使用文件内容来分析文件类型