前言

  今天项目上遇到了一个问题,用户需要导入一个从我们服务器上下载的EXCEL文件,前端根据获取到的文件的type属性进行判断是否可以上传["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.ms-excel"],但是在某一个用户的电脑上却出现了通过<input type="file">获取到的file对象中,type属性为"",于是开始找各种资料希望了解浏览器是如何获取这个type属性的,为什么同一个文件不同的电脑获取到的属性不一样。

MIME Type是什么

  根据MDN上的说明,MIME Type (Multipurpose Internet Mail Extensions (MIME) type)是一种标准化的方式来表示文档的性质和格式。它在IETF RFC 6838中进行了定义和标准化。
  浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理文档;因此服务器设置正确以将正确的MIME类型附加到响应对象的头部是非常重要的。所以浏览器中<input type="file">获取到的file对象中的type属性其实是文件的MIME Type。

Chrome获取MIME类型

  在chromium开源代码中 https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=314 314-318行中提到了:

  // We implement the same algorithm as Mozilla for mapping a file extension to// a mime type.  That is, we first check a hard-coded list (that cannot be// overridden), and then if not found there, we defer to the system registry.// Finally, we scan a secondary hard-coded list to catch types that we can// deduce but that we also want to allow the OS to override.

  Chrome实现了与Mozilla相同的算法,将文件扩展名映射到MIME类型。
首先,Chrome会检测一个硬编码列表(不能被覆盖)源码中的kPrimaryMappings,然后如果没有找到符合的,Chrome会从操作系统注册表中找,最后会扫描一个二级硬编码列表,源码中的kSecondaryMappings,用来捕获可以推断但是也希望允许操作系统覆盖的类型。
  例如:从安装了Microsoft Excel的Windows系统上传CSV文件时,Chrome会将其报告为application/vnd.ms-excel。这是因为.csv未在第一个硬编码列表中指定,因此浏览器会回退到系统注册表。HKEY_CLASSES_ROOT\.csv有一个名为的值Content Type设置为application/vnd.ms-excel

总结

  前言中遇到的问题浏览器中获取不到type属性不一定是代码的原因,而是系统中所安装的Microsoft Excel软件或注册表的原因,另外在MDN中的File对象中也找到这也一句描述:基于当前的实现,浏览器不会实际读取文件的字节流,来判断它的媒体类型。它基于文件扩展来假设;重命名为 .txt 的 PNG 图像文件为 "text/plain" 而不是 "image/png" 。而且,file.type 仅仅对常见文件类型可靠。例如图像、文档、音频和视频。不常见的文件扩展名会返回空字符串。开发者最好不要依靠这个属性,作为唯一的验证方案。

由input type=file /获取的file.type为空字符串引申浏览器是如何获取文件的MIME类型...相关推荐

  1. java 生成msg文件_java – 如何获取.MSG文件的MIME类型?

    我尝试了一些可能的方法,并使用tika给出您的期望结果,我没有看到您使用的代码,所以我无法仔细检查. 我尝试了不同的方式,并不是所有的代码片段: > Java 7 Files.probeCont ...

  2. 获取文件的MIME类型

    package priv.lwx.javaex.servlet_demo.web.servletcontext; /*** 获取MIME类型** @author liaowenxiong* @date ...

  3. [笔记] C# 如何获取文件的 MIME Type

    MIME Type 为何物: MIME 参考手册 svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types 常规方式 对于有文件后 ...

  4. Android打开各种文件的MIME TYPE-setDataAndType函数中的Type关联

    MIME:全称Multipurpose Internet Mail Extensions,多功能Internet 邮件扩充服务.它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后 ...

  5. linux 添加mime类型,Linux MIME type

    什么是MIME Type MIME Type是用于描述文件的类型的一种表述方法,其将文件划分为多种类型,方便对其进行统一的管理. MIME Type指定了文件的类型名称.描述.图标信息,同时通过与.d ...

  6. 从文件扩展名获取MIME类型

    本文翻译自:Get MIME type from filename extension 如何从文件扩展名中获取MIME类型? #1楼 参考:https://stackoom.com/question/ ...

  7. finfoopen需要什么扩展 php_php获取文件mime类型的四种方法

    何为MIME类型,它是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开. 多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式. ...

  8. finfoopen需要什么扩展 php_php获取文件mime类型的几种方法

    MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开.多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式. ph ...

  9. 关于input type=file 限制文件上传类型

    HTML <input> 标签的 accept 属性 <input type="file" name="pic" id="pic&q ...

  10. Spring 之MultipartFile转换File 并鉴别File Mine Type 类型

    常见 MIME 类型列表 扩展名 文档类型 MIME 类型 .aac AAC audio audio/aac .abw AbiWord document application/x-abiword . ...

最新文章

  1. ruby json转化成对象_系统架构迁移实例:从Ruby到Rust
  2. Inline Hook
  3. Bochs调试及相关仿真工具的使用方法
  4. 2018年企业运维开发经典面试题
  5. Linux网络编程——浅谈 TCP 三次握手和四次挥手
  6. 还在魔改Transformer结构吗?微软中山大学开源超强的视觉位置编码,涨点显著
  7. SAP S4CRM和C4C的技术比较
  8. win10运行Git出现警告 :warning: LF will be replaced by CRLF in ...
  9. postgressql数据库给模式添加search_path
  10. Realme真我X7系列首发骁龙860? 副总裁辟谣:大家散了吧
  11. nvidia TX2 CUDA yolov5环境搭建
  12. 如何移动没有标题的窗体
  13. python能做什么工作-python能做哪方面的工作
  14. 交通银行软件中心编制_智能运维国家标准编制启动会在京举行 云智慧参与标准制定...
  15. 5.UML2 软件建模入门与提高 --- 类图
  16. qt 界面控件布局
  17. COJ 0358 xjr考考你数据结构(根号3)线段树区间修改
  18. /deep/在chrome89+中出现样式混乱的问题
  19. 汽车维修企业管理【11】
  20. Mono.Cecil 初探(一):实现AOP

热门文章

  1. Java NIO1:I/O模型概述
  2. 关于android studio的配置记录
  3. Delphi中用Sender参数实现代码重用
  4. 【转】Linux配置使用SSH Key登录并禁用root密码登录
  5. 洛谷2805 [NOI2009]植物大战僵尸 (拓扑排序+最小割)
  6. 比较两个时间的大小 举例:CompareDate(12:00,11:15)
  7. NotePad++常用快捷键。——Arvin
  8. spark streaming之 windowDuration、slideDuration、batchDuration​
  9. 生成验证码封装(新版)
  10. jQuery 实现邮箱输入自动提示功能:(二)