在浏览器中检测上传的图片格式是否正确

Detect within the browser if the image uploaded is of correct format

我有一张 file.svg 图片,我将文件重命名为 file.jpg

现在在浏览器中打开这个jpg文件肯定无法预览我的图片。所以我正在尝试的是检测通过输入表单上传的 jpg 图像是否实际上是浏览器中的 jpg。

我尝试以 base64 格式读取文件,但找不到任何内容。有一种方法可以检测 jpg 图片是否被截断 这是对那篇文章的引用

如何检测图像的类型是否与扩展名一样正确?

像这样在输入上添加事件处理程序 onChange:

<input type="file" id="file_uploader" />

然后在 javascript 中添加一个事件处理程序,它将侦听该输入的变化:

const file_input = document.getElementById(("file_uploader")

file_input.addEventListener("change", handleChange)

这将自动将 event 传递给 handleChange,因此您实际上可以引用它:

const handleChange = e => {
    const name = e.targe.file[0].name
    // name = filename.extnesion
    const extension = name.split(".")[1]
}

Split 方法将给出一个包含 2 个字符串的数组 - . 之前的字符串 - 文件名,以及 . 之后的字符串 - 扩展名。

仅通过查看文件名来查找 mime 类型是不安全的。 您应该通过读取位于文件内容开头的签名字节来找到文件的确切 MIME 类型。

通过 this list 您可以找到签名-mime 类型配对。

我在下面写了一个示例代码,您可以在其中检查所选文件是否 是否为有效的 jpeg 文件。 JPEG 有一个简单的签名,如果文件的前 2 个字节是 0xFF 和 0xD8 你可以说这个文件是一个 jpeg 文件。 (更完整的签名信息请查看列表)

document.querySelector('input').addEventListener('change', function() 
{
 var reader = new FileReader();
 reader.onload = function()
 {
  var bytes = new Uint8Array(this.result);
  if ((bytes[0] == 0xFF) && (bytes[1] == 0xD8))
   console.log("this is a valid jpeg file");
  else
   console.log("this does not look like a jpeg file");
 }
 reader.readAsArrayBuffer(this.files[0]);
});
<input type="file">

正如 Alper Cinar 所提到的,读取扩展名是不安全的,以及我们如何读取起始字节来识别 MIME 类型。我想添加一个小代码片段,不仅可以识别 jpg 的 mime 类型,还可以识别 gifs 和 pngs

      const blob = files[0];
      const fileReader = new FileReader();
      fileReader.readAsArrayBuffer(blob);
      fileReader.onloadend = (e) => {
        const arr = (new Uint8Array(<any>e.target.result)).subarray(0, 4);
        let header = '';
        for (let i = 0; i < arr.length; i++) {
          header += arr[i].toString(16);
        }
        console.log(header);
        let type: any;
        switch (header) {
          case '89504e47':
            type = 'image/png';
            break;
          case '47494638':
            type = 'image/gif';
            break;
          case 'ffd8ffe0':
          case 'ffd8ffe1':
          case 'ffd8ffe2':
          case 'ffd8ffe3':
          case 'ffd8ffe8':
            type = 'image/jpeg';
            break;
          default:
            type = 'unknown';
            break;
        }
        console.log(type);

      };

详细参考 How to check file MIME type with javascript before upload?