IE 11和IE Edge无法获取文件类型

7
"change .btn-file :file"       : "getfileinfo",

getfileinfo: function(e){

    var fileInput = document.getElementById('fileupload');
    var file = fileInput.files[0];

    if(!file || (file.type != 'text/plain' && file.type != 'text/csv' && file.type != 'application/csv' && file.type != 'application/vnd.ms-excel' && file.type != 'text/csv')){
        $('.alert-file').show();
        $('.alert-file').delay(4000).fadeOut('slow');
        return false;
    }
    var reader = new FileReader();

    reader.onload = function(e) {
        $('#fileData').val(reader.result);
        $('#fileName').val(file.name); 

    };
    reader.readAsDataURL(file);

}

file.type 在IE11和Edge中返回null,而其他浏览器正常工作。

有人能帮我解决这个问题吗?


请格式化您的代码。 - user2118542
在提问之前,请先进行一些思考。您是否看过http://stackoverflow.com/questions/27980428/javascript-file-type-is-not-working-on-ie-11? - user2118542
是的,我看到了,但是没有答案。 - Gopi
我没有看到 null;你能测试一下这个链接吗 http://jsfiddle.net/w7dLjvxt/? - Sampson
你有检查过IE EDGE吗?我正在Win10 IE Edge中进行测试。即使我测试了你的代码[object File]{lastModifiedDate: date, name: "sample.csv", size: 236, type: ""},请查看控制台。 - Gopi
显示剩余8条评论
2个回答

6

测试用例

<input type="file" onchange="document.body.innerText = this.files[0].type" />

针对SVG、PNG和ZIP,返回MIME类型;但是对于PDF,返回""

在Windows 8.1 Pro x64系统下的IE11中验证过。

Version: 11.0.9600.18053
Update Versions: 11.0.24 (KB3093983)

已经报告了错误并关闭了“无法重现” https://connect.microsoft.com/IE/Feedback/Details/2009205 。它提到了为什么IE团队不能重现的原因:

请记住,仅当该MIME类型的处理程序应用程序(例如Adobe Reader)安装在系统上并在注册表的HKEY_CLASSES_ROOT注册表中创建映射时,IE才可以根据其扩展名确定文件的MIME类型 注册表中不存在映射,则 IE 无法知道文件的 MIME 类型。

在刚刚安装的 20GB 的 Windows 中,没有空间放置 file 工具。


这怎么算是一个答案? - Bonatti
@Bonatti,无法复现,我已经清理了测试用例(源代码清晰度和文件类型),描述了确切的环境,应该有所帮助。 - sergeykish
在stackoverflow上的回答应该是帮助提问者解决问题或者提供文档以便理解问题的方式...而你的回答既不是前者也不是后者,如果一个新手查看你的“答案”,他仍然不会知道该怎么做...请阅读此链接 - Bonatti
至少他相信自己的眼睛,在最新而辉煌的IE浏览器中发现了一个bug。唯一真正的答案来自IE团队 - 修复这个bug。这需要关注和测试用例。这就是我所能做的。 - sergeykish
当询问为什么file.type为空时,被告知“可能永远不会填充”难道不是一个答案吗?这样,开发人员就可以确定他们必须使用自己选择的替代方法,或者放弃该功能,转而使用类似的东西。 - Karl

1
我能在免费的 Windows 7 / IE 11 虚拟机上(此处可用)重现此错误,这个虚拟机没有默认的 PDF 处理程序,因此不知道 mimetype 是什么。
因此,我想到的唯一解决方法是这样的(以 PDF 文件为例 - 根据需要更改应用程序/pdf 和 pdf):
if(file.type == 'application/pdf' || file.name.toLowerCase().endsWith('pdf'))
{
    //code to execute
}

请注意,如果没有在所有版本的IE上使用polyfill,则此方法将无法正常工作 - 因此,这里是polyfill片段,您需要在代码中的任何位置包含它(来自Mozilla页面)。
if (!String.prototype.endsWith) {
  String.prototype.endsWith = function(searchString, position) {
      var subjectString = this.toString();
      if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
        position = subjectString.length;
      }
      position -= searchString.length;
      var lastIndex = subjectString.lastIndexOf(searchString, position);
      return lastIndex !== -1 && lastIndex === position;
  };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接