IE11报错800a138f:自定义File函数失效,求排查方案
问题排查与解决方案
这个问题我之前帮人处理过,IE11的File/Blob API兼容性确实是个老生常谈的坑,咱们一步步拆解原因和解决办法:
错误原因分析
你遇到的Error: Could not complete the operation due to error 800a138f本质是IE11的JScript引擎抛出的**「对象不支持此属性或方法」**错误,具体原因有两个:
- IE11的
Blob对象不允许直接添加name和lastModifiedDate属性——这两个是标准File对象的属性,但IE11的Blob是只读的原生对象,无法扩展这些自定义属性,赋值操作会直接失败,导致函数返回的对象异常(甚至变成null)。 - IE11本身不支持ES标准的
new File()构造函数,你用Blob模拟File的写法在Chrome/Firefox这类现代浏览器中可行,但在IE11里完全走不通。
兼容解决方案
我们需要针对IE11做专属的兼容处理,同时保留现代浏览器的标准逻辑:
1. 兼容版File构造函数
修改你的File函数,加入IE11检测和专属API调用:
function createFile(content, fileName, options) { // 检测是否为IE11(唯一可靠的检测方式) const isIE11 = !!window.MSInputMethodContext && !!document.documentMode; if (isIE11) { // IE11使用专属的MSBlobBuilder构建Blob const blobBuilder = new window.MSBlobBuilder(); // 注意:MSBlobBuilder的append方法接受字符串/ArrayBuffer,根据你的content类型调整 blobBuilder.append(content[0]); const blob = blobBuilder.getBlob(options?.type); // IE11无法给Blob加属性,返回一个包含Blob和所需属性的包装对象 return { blob: blob, name: fileName, lastModifiedDate: new Date() }; } else { // 现代浏览器直接使用标准File构造函数(比Blob模拟更规范) return new File(content, fileName, options); } }
2. 配套的文件操作兼容(比如下载)
如果你的场景是下载文件,IE11也需要用专属的msSaveBlob方法,不能用现代浏览器的URL.createObjectURL:
function downloadFile(fileObj, fileName) { const isIE11 = !!window.MSInputMethodContext && !!document.documentMode; if (isIE11) { // IE11直接调用msSaveBlob下载 window.navigator.msSaveBlob(fileObj.blob, fileName || fileObj.name); } else { // 现代浏览器用标准下载逻辑 const url = URL.createObjectURL(fileObj); const a = document.createElement('a'); a.href = url; a.download = fileName || fileObj.name; a.click(); URL.revokeObjectURL(url); } }
额外注意事项
- 不要用
userAgent检测IE11,因为它的UA字符串很容易被修改,用window.MSInputMethodContext + document.documentMode是最可靠的方式。 - 如果你的
content是ArrayBuffer或其他类型,需要调整MSBlobBuilder.append的参数,确保IE11能正确解析。
内容的提问来源于stack exchange,提问作者Aniket Thakur
相关产品推荐
相关产品推荐

