由input type=file /获取的file.type为空字符串引申浏览器是如何获取文件的MIME类型...
前言
今天项目上遇到了一个问题,用户需要导入一个从我们服务器上下载的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类型...相关推荐
- java 生成msg文件_java – 如何获取.MSG文件的MIME类型?
我尝试了一些可能的方法,并使用tika给出您的期望结果,我没有看到您使用的代码,所以我无法仔细检查. 我尝试了不同的方式,并不是所有的代码片段: > Java 7 Files.probeCont ...
- 获取文件的MIME类型
package priv.lwx.javaex.servlet_demo.web.servletcontext; /*** 获取MIME类型** @author liaowenxiong* @date ...
- [笔记] C# 如何获取文件的 MIME Type
MIME Type 为何物: MIME 参考手册 svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types 常规方式 对于有文件后 ...
- Android打开各种文件的MIME TYPE-setDataAndType函数中的Type关联
MIME:全称Multipurpose Internet Mail Extensions,多功能Internet 邮件扩充服务.它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后 ...
- linux 添加mime类型,Linux MIME type
什么是MIME Type MIME Type是用于描述文件的类型的一种表述方法,其将文件划分为多种类型,方便对其进行统一的管理. MIME Type指定了文件的类型名称.描述.图标信息,同时通过与.d ...
- 从文件扩展名获取MIME类型
本文翻译自:Get MIME type from filename extension 如何从文件扩展名中获取MIME类型? #1楼 参考:https://stackoom.com/question/ ...
- finfoopen需要什么扩展 php_php获取文件mime类型的四种方法
何为MIME类型,它是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开. 多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式. ...
- finfoopen需要什么扩展 php_php获取文件mime类型的几种方法
MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开.多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式. ph ...
- 关于input type=file 限制文件上传类型
HTML <input> 标签的 accept 属性 <input type="file" name="pic" id="pic&q ...
- Spring 之MultipartFile转换File 并鉴别File Mine Type 类型
常见 MIME 类型列表 扩展名 文档类型 MIME 类型 .aac AAC audio audio/aac .abw AbiWord document application/x-abiword . ...
最新文章
- ruby json转化成对象_系统架构迁移实例:从Ruby到Rust
- Inline Hook
- Bochs调试及相关仿真工具的使用方法
- 2018年企业运维开发经典面试题
- Linux网络编程——浅谈 TCP 三次握手和四次挥手
- 还在魔改Transformer结构吗?微软中山大学开源超强的视觉位置编码,涨点显著
- SAP S4CRM和C4C的技术比较
- win10运行Git出现警告 :warning: LF will be replaced by CRLF in ...
- postgressql数据库给模式添加search_path
- Realme真我X7系列首发骁龙860? 副总裁辟谣:大家散了吧
- nvidia TX2 CUDA yolov5环境搭建
- 如何移动没有标题的窗体
- python能做什么工作-python能做哪方面的工作
- 交通银行软件中心编制_智能运维国家标准编制启动会在京举行 云智慧参与标准制定...
- 5.UML2 软件建模入门与提高 --- 类图
- qt 界面控件布局
- COJ 0358 xjr考考你数据结构(根号3)线段树区间修改
- /deep/在chrome89+中出现样式混乱的问题
- 汽车维修企业管理【11】
- Mono.Cecil 初探(一):实现AOP
热门文章
- Java NIO1:I/O模型概述
- 关于android studio的配置记录
- Delphi中用Sender参数实现代码重用
- 【转】Linux配置使用SSH Key登录并禁用root密码登录
- 洛谷2805 [NOI2009]植物大战僵尸 (拓扑排序+最小割)
- 比较两个时间的大小 举例:CompareDate(12:00,11:15)
- NotePad++常用快捷键。——Arvin
- spark streaming之 windowDuration、slideDuration、batchDuration​
- 生成验证码封装(新版)
- jQuery 实现邮箱输入自动提示功能:(二)