前端文件上传识别文件类型的几种方法,快看你是哪个?

这篇具有很好参考价值的文章主要介绍了前端文件上传识别文件类型的几种方法,快看你是哪个?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在我们的日常开发过程中,我们会经常接触到一些文件上传的事情,其中在前端这边识别识别文件类型的是非常常见的功能,例如来限制文件上传的类型,接下来我们来了解一下最常见的几种方式。

通过文件扩展名判断类型

最简单快捷的方法就是 hiyaJavaScript 获取文件名的扩展名,对比扩展名来判断文件类型,如下代码所示:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>文件类型识别</title>
  </head>
  <body>
    <h2>文件类型识别</h2>
    <input type="file" id="fileInput" />
    <p id="fileType">文件类型</p>

    <script>
      document
        .getElementById("fileInput")
        .addEventListener("change", function (event) {
          const file = event.target.files[0];
          if (!file) {
            document.getElementById("fileType").textContent = "没有文件被选中";
            return;
          }

          const fileName = file.name;
          const extensionIndex = fileName.lastIndexOf(".");
          let fileType;

          if (extensionIndex === -1 || extensionIndex === 0) {
            fileType = "未知";
          } else {
            fileType = fileName.substring(extensionIndex + 1);
          }

          document.getElementById("fileType").textContent =
            "文件类型: " + fileType;
        });
    </script>
  </body>
</html>

当然 JavaScript 这方面的代码你也可以这样子实现,看你需求:

document
  .getElementById("fileInput")
  .addEventListener("change", function (event) {
    const file = event.target.files[0];
    if (!file) {
      document.getElementById("fileType").textContent = "没有文件被选中";
      return;
    }

    let fileType = file.type;
    if (!fileType) {
      const fileNameParts = file.name.split(".");
      const extension = fileNameParts[fileNameParts.length - 1];
      if (extension === "md") {
        fileType = "text/markdown";
      }
    }

    document.getElementById("fileType").textContent = "文件类型: " + fileType;
  });

上传一个文件,文件的类型被输出出来了:

前端上传apk文件文件类型怎么选,前端

仅通过文件扩展名来判断类型存在安全和准确性风险,因为它可能被恶意用户篡改以上传危险文件,且不能可靠地反映文件的真实内容,同时还无法识别没有扩展名的文件。

通过 MIME 类型判断

当我们使用 HTML 的 <input type="file"> 标签时,可以通过文件的 type 属性获取 MIME 类型:

document
  .getElementById("fileInput")
  .addEventListener("change", function (event) {
    const file = event.target.files[0];
    if (!file) {
      document.getElementById("fileType").textContent = "没有文件被选中";
      return;
    }

    document.getElementById("fileType").textContent = "文件类型: " + file.type;
  });

这段代码为文件输入元素添加了一个 change 事件监听器。当用户选择文件后,会触发这个事件。事件处理函数会获取用户选中的文件,并显示它的 MIME 类型。

前端上传apk文件文件类型怎么选,前端

MIME(多用途互联网邮件扩展,Multi-purpose Internet Mail Extensions)最初是为了改进电子邮件中的文件传输而设计的,但它的使用范围已经扩展到互联网的其他领域。MIME 定义了一系列的数据类型和数据格式,用于在网络上交换数据。

但是 MIME 类型有时可能不准确或为空。

前端上传apk文件文件类型怎么选,前端

使用 FileReader 读取文件内容

FileReader 是 HTML5 提供的 API,可以用来读取文件的内容,通过读取文件内容的一部分,可以更准确地判断文件类型:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>读取文件内容</title>
  </head>
  <body>
    <input type="file" id="fileInput" />
    <div id="fileContent">文件类型</div>

    <script>
      document
        .getElementById("fileInput")
        .addEventListener("change", function (event) {
          const file = event.target.files[0];
          if (!file) {
            document.getElementById("fileContent").textContent =
              "没有文件被选中";
            return;
          }

          const reader = new FileReader();

          reader.onloadend = function (e) {
            const arr = new Uint8Array(e.target.result).subarray(0, 4);
            let header = "";
            for (let i = 0; i < arr.length; i++) {
              header += arr[i].toString(16).padStart(2, "0");
            }

            let fileType = "未知";
            switch (header) {
              case "89504e47":
                fileType = "图片 (PNG)";
                break;
              case "47494638":
                fileType = "图片 (GIF)";
                break;
              case "ffd8ffe0":
              case "ffd8ffe1":
              case "ffd8ffe2":
                fileType = "图片 (JPEG)";
                break;
              case "25504446":
                fileType = "文档 (PDF)";
                break;
              // 更多文件类型...
              default:
                fileType = "未知";
            }
            document.getElementById("fileContent").textContent =
              "文件类型: " + fileType;
          };

          reader.onerror = function () {
            document.getElementById("fileContent").textContent = "文件读取出错";
          };

          reader.readAsArrayBuffer(file);
        });
    </script>
  </body>
</html>

在上面的代码中读取了文件的前四个字节来判断文件类型。它包含了用于标识文件格式的特定模式或“魔术数字”。

前端上传apk文件文件类型怎么选,前端

文件类型被正确输出。

HTML5 File API

使用 HTML5 File API 可以读取用户在浏览器中选择的文件的信息,包括文件类型。这个 API 提供了一个标准的方式来获取关于文件的信息,如文件名、大小以及 MIME 类型。

document
  .getElementById("fileInput")
  .addEventListener("change", function (event) {
    const file = event.target.files[0];
    if (!file) {
      document.getElementById("fileInfo").textContent = "没有选择文件";
      return;
    }

    const fileInfo = `文件名: ${file.name}<br>文件大小: ${file.size} 字节<br>文件类型: ${file.type}`;
    document.getElementById("fileInfo").innerHTML = fileInfo;
  });

最终输出效果如下图所示:

前端上传apk文件文件类型怎么选,前端

装 X 必备,WebAssembly

使用 WebAssembly (WASM) 对文件进行识别通常涉及到较为复杂的操作,因为你需要将文件处理逻辑编译为 WASM 模块,然后在 JavaScript 中调用这个模块来处理文件。

第一步,我们以 C 为例子,接下来我们编写一个 C 代码,如下:

#include <string.h>
#include <emscripten.h>

// 检查 PNG
int is_png(const unsigned char *buffer) {
    const unsigned char png_signature[8] = {0x89, 'P', 'N', 'G', 0x0D, 0x0A, 0x1A, 0x0A};
    return memcmp(buffer, png_signature, 8) == 0;
}

// 检查 JPEG
int is_jpeg(const unsigned char *buffer) {
    return buffer[0] == 0xFF && buffer[1] == 0xD8 && buffer[2] == 0xFF;
}

// 检查 GIF
int is_gif(const unsigned char *buffer) {
    return strncmp((const char *)buffer, "GIF", 3) == 0;
}

// 检查 PDF
int is_pdf(const unsigned char *buffer) {
    return strncmp((const char *)buffer, "%PDF-", 5) == 0;
}

// 主函数,用于检测文件类型
EMSCRIPTEN_KEEPALIVE
int check_file_type(const unsigned char *buffer, int length) {
    if (is_pdf(buffer)) {
        return 1;
    } else if (is_png(buffer)) {
        return 2;
    } else if (is_jpeg(buffer)) {
        return 3;
    } else if (is_gif(buffer)) {
        return 4;
    }
    return 0; // 未知类型
}

在上面的这些代码中,通过比较输入流的前 8 个字节与这个序列来判断是否为某个文件。

代码编写完成之后,我们要在终端执行一行命令如下所示:

emcc index.c -s WASM=1 -o index.js -s EXPORTED_FUNCTIONS='["_check_file_type", "_malloc", "_free"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'

最终会生成这两个文件:

前端上传apk文件文件类型怎么选,前端

这个时候我们就可以在我们前端中使用了,编写如下代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>文件类型识别</title>
    <script src="./index.js"></script>
  </head>
  <body>
    <input type="file" id="fileInput" />

    <script>
      const fileInput = document.getElementById("fileInput");

      Module.onRuntimeInitialized = () => {
        fileInput.addEventListener("change", (event) => {
          const file = event.target.files[0];
          if (!file) {
            return;
          }

          const reader = new FileReader();
          reader.onload = (e) => {
            const buffer = new Uint8Array(e.target.result);

            // 分配内存并将数据复制到 WebAssembly 的内存空间
            const dataPtr = Module._malloc(buffer.length);
            Module.HEAPU8.set(buffer, dataPtr);

            // 调用 WebAssembly 函数
            const fileType = Module.ccall(
              "check_file_type", // C 函数名
              "number", // 返回值类型
              ["number", "number"], // 参数类型
              [dataPtr, buffer.length] // 参数
            );

            // 输出文件类型到控制台
            console.log("文件类型 ID:", fileType);

            // 释放内存
            Module._free(dataPtr);
          };
          reader.readAsArrayBuffer(file);
        });
      };
    </script>
  </body>
</html>

这样,我们就可以根据不同的 id 来返回不同的文件类型了:

前端上传apk文件文件类型怎么选,前端

通过以上步骤,我们实现了一个使用 WebAssembly 来识别文件类型并在浏览器控制台上输出结果的功能。

总结

除了这些之外,我们还可以使用第三方库 file-type 来实现文件类型检测,这里我们就不再进行 demo 演示了,感兴趣的可以去官方文档中进行查阅。

另外最近对脚手架的仓库代码进行了重构,之后会越来越规范,规模会越来越大,感兴趣的小伙伴可以加入来一起开发,春招没有项目的朋友也可以以此作为春招的项目:

前端上传apk文件文件类型怎么选,前端文章来源地址https://www.toymoban.com/news/detail-830883.html

到了这里,关于前端文件上传识别文件类型的几种方法,快看你是哪个?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端常问的几种网络安全攻击类型

    就是攻击者想尽一切办法将可以执行的代码注入到网页中。 存储型(server端): 场景:见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。 攻击步骤: i)攻击者将恶意代码提交到目标网站的数据库中 ii)用户打开目标网站时,服务端将恶意代码从数

    2024年02月06日
    浏览(33)
  • MacBook 往服务器上传、下载文件的几种操作

    往服务器传文件、下载文件有很多种方法,可以使用scp、rsync或者rs/sz MacBook上的rz和sz 配置起来比较麻烦 这里就不说了 另外 研发和测试同学可能对于scp命令和rsync命令并不了解 这里也不说了 这里直说两种图形化界面的工具 通过jumpserver登录服务器后 可以简单快速实现上传和

    2024年02月16日
    浏览(49)
  • 前端生成分享海报的几种方法

    1,使用painter插件    适用于微信小程序及uniapp的小程序端 ①,引入插件painter    克隆地址:https://gitcode.net/mirrors/Kujiale-Mobile/Painter    下载的 painter 放到微信小程序的 components 目录下 ②在json文件中引入 \\\"usingComponents\\\": {         \\\"painter\\\":\\\"/components/painter/painter\\\" }, 注:在u

    2024年02月21日
    浏览(47)
  • 解决前端跨域的几种方法

    一、跨域报错         在我们实际开发过程中,都有遇到过跨域的问题,跨域报错如下: 二、为什么会报跨域?         跨域的本质是浏览器基于同源策略的一种安全手段,主要是考虑到用户的信息安全。何为同源策略呢?同源策略是一种约定,它是浏览器最核心也

    2024年02月09日
    浏览(29)
  • unity碰撞检测识别对象的几种方法,刚体篇

    可以在物体的Collider组件中设置碰撞层级,只有属于指定层级的物体才会响应碰撞事件。例如,我们可以将敌人设置为一个单独的层级,然后在玩家的脚本中检测碰撞时,只响应属于敌人层级的物体。 可以在物体的Collider组件中设置标签,然后在脚本中检测碰撞时,只响应标

    2024年02月11日
    浏览(25)
  • 前端下载文件的几种方式使用Blob下载文件

    前端下载文件的几种方式 使用Blob下载文件 在前端下载文件是个很通用的需求,一般后端会提供下载的方式有两种: 1.直接返回文件的 网络地址 (一般用在静态文件上,比如图片以及各种音视频资源等) 2.返回 文件流 (一般用在动态文件上,比如根据前端选择,导出不同的

    2024年02月05日
    浏览(34)
  • 前端展示 PDF 预览的几种方法

    一、js实现pdf预览 HTML 内联框架元素 iframe 表示嵌套的 browsing context。它能够将另一个 HTML 页面嵌入到当前页面中。 HTML embed 元素将外部内容嵌入文档中的指定位置。此内容由外部应用程序或其他交互式内容源(如浏览器插件)提供 HTML object 元素(或者称作 HTML 嵌入对象元素)

    2024年02月09日
    浏览(30)
  • 前端下载文件(Blob)的几种方式使用Blob下载文件

    在前端下载文件是个很通用的需求,一般后端会提供下载的方式有两种: 1.直接返回文件的网络地址(一般用在静态文件上,比如图片以及各种音视频资源等) 2.返回文件流(一般用在动态文件上,比如根据前端选择,导出不同的统计结果 excel 等) 第一种方式比较简单,但

    2024年02月07日
    浏览(43)
  • 前端开发中,定位bug的几种常用方法

    目录 第一章 前言 第二章 解决bug的方法 2.1 百度 2.2 有道翻译 2.3 debugger 2.4 console.log 日志打印 2.5 请求体是否携带参数 2.6 注释页面渲染代码 2.7 其他 第三章 尾声 备注:该文章只是本人在工作/学习中常用的几种方法,如果有不对大家“胃口”的地方,勿喷,可以在评论区提供

    2024年02月04日
    浏览(39)
  • 记录--盘点前端实现文件下载的几种方式

    前端涉及到的文件下载还是很多应用场景的,那么前端文件下载有多少种方式呢?每种方式有什么优缺点呢?下面就来一一介绍。 通过 a 标签的 download 属性来实现文件下载,这种方式是最简单的,也是我们比较常用的方式,先来看示例代码: 就上面的这个示例,我们点击下

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包