在 IE XMLHttpRequest 中读取文件:// URL

Posted

技术标签:

【中文标题】在 IE XMLHttpRequest 中读取文件:// URL【英文标题】:Read file:// URLs in IE XMLHttpRequest 【发布时间】:2011-01-09 16:10:03 【问题描述】:

我正在开发一个 javascript 应用程序,它既可以从 Web 服务器(通过 http)运行,也可以从文件系统(通过 file:// URL)运行。

作为此代码的一部分,我需要使用 XMLHttpRequest 将文件加载到与页面相同的目录以及页面的子目录中。

此代码在 Web 服务器上执行时可以正常工作(“PASS”),但在 Internet Explorer 8 中运行文件系统时无法正常工作(“FAIL”):

<html><head>
<script>
window.onload = function() 
  var xhr = new XMLHttpRequest();
  xhr.open("GET", window.location.href, false);
  xhr.send(null);
  if (/TestString/.test(xhr.responseText)) 
    document.body.innerHTML="<p>PASS</p>";
  

</script>
<body><p>FAIL</p></body>

当然,起初它失败了,因为文件系统上根本没有脚本可以运行;系统会提示用户一个黄色条,警告“为了帮助保护您的安全,Internet Explorer 已限制此网页运行可能访问您计算机的脚本或 ActiveX 控件。”

但即使我点击了栏并“允许被阻止的内容”,页面仍然失败;我在 xhr.open 调用中收到“拒绝访问”错误。

这让我很困惑,因为MSDN 说“出于开发目的,本地机器区域允许使用 file:// 协议。”这个本地文件应该是本地机器区的一部分吧?

我怎样才能让这样的代码工作?我可以通过安全警告提示用户;我不能强迫他们关闭控制面板中的安全功能。

编辑:事实上,在我的情况下,我并没有加载 XML 文档。我正在加载一个纯文本文件 (.txt)。

【问题讨论】:

你试过了吗 var xhr = new ActiveXObject("MSXML2.XMLHTTP"); (见下面我的回答)?这不应该仅限于 XML 文件。但仅限于 IE。 FWIW,我在 Chrome 中遇到了同样的问题,基本上做同样的事情。 【参考方案1】:

嗯,这可能是原生 XMLHttpRequest 对象和 ActiveX 对象之间的区别吗?我好像想起了什么。也就是说,而不是

var xhr = new XMLHttpRequest();

试试

var xhr = new ActiveXObject("MSXML2.XMLHTTP");

显然,请检查浏览器是否支持 ActiveX。当然,这也仅限于 IE。

【讨论】:

在 IE10 中仍然获得权限被拒绝 嗯嗯是的 SCRIPT5:访问被拒绝。同样的错误来了:( 在 IE 上完美运行,但同时在 Chrome 上无法运行。【参考方案2】:

我怎样才能让这样的代码工作?

如上所述,这看起来像是Microsoft XMLHttpRequest 中的错误。 jQuery(2011 年 7 月)还写道:-

微软在IE7中未能正确实现XMLHttpRequest(无法请求本地文件)

我也确认了 IE8 的失败。

如果XMLHttpRequest 不起作用,解决方案是对本地文件使用new window.ActiveXObject( "Microsoft.XMLHTTP" )

失败出现在xhr.open 行,因此可以在那里捕获,然后尝试ActiveXObject,如下所示:-

var xhr = new XMLHttpRequest()
try 
    xhr.open('GET', url, true)

catch(e) 
    try 
        xhr = new ActiveXObject('Microsoft.XMLHTTP')
        xhr.open('GET', url, true)
    
    catch (e1) 
        throw new Error("Exception during GET request: " + e1)
    

如果/当 Microsoft 修复故障时,此代码将至少使用标准 XMLHttpRequest 用于 IE9(未经测试)和未来的 IE 浏览器。使用上面的jQuery 代码,只要ActiveXObject 可用,就会使用非标准Microsoft.XMLHTTP,即使Microsoft 修复了错误。

【讨论】:

不起作用。在 IE10 中仍然使用 new ActiveXObject('Microsoft.XMLHTTP') 拒绝权限 在工作中也遇到了这个问题。对于本地文件,XMLHttpRequest 显然失败,甚至达到 IE11。想知道为什么微软从来没有解决过这个问题……也许他们在 Edge 中做到了,我不知道。好在 ActiveXObject 至少可以工作。【参考方案3】:

我恰好偶然发现了完全相同的问题。如上所述,非本机 ActiveX“构造函数”有效。我不确定这两个对象是否应用了不同的策略,但由于 jQuery 也提到了同样的问题,这可能是一个真正的错误。这是来自 jQuery 源代码(1.4.2,第 4948 行)的相关代码:

// Create the request object; Microsoft failed to properly
// implement the XMLHttpRequest in IE7 (can't request local files),
// so we use the ActiveXObject when it is available
// This function can be overriden by calling jQuery.ajaxSetup
xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
    function() 
        return new window.XMLHttpRequest();
     :
    function() 
        try 
            return new window.ActiveXObject("Microsoft.XMLHTTP");
         catch(e) 
    

【讨论】:

啊,这解释了为什么当我们使用 .load 方法时,将 jQuery 升级到 v1.11.1 会导致 IE11 上的权限问题。我猜 jQuery 在某个版本之后才停止检查这个。【参考方案4】:

我知道这已经过时了 - 但想通过更详细的说明来澄清发生了什么,并提供一些潜在的选择。

首先,这实际上不是 IE 中的缺陷,而是 Chrome 中也存在的安全功能。

基本上,任何带有 file:// 前缀的资源 URI 都不允许使用 XMLHttpRequest 加载任何其他带有 file:// 前缀的资源 URI。

在 IE 中,您将看到拒绝访问消息。在 Chrome 中,您将看到“加载资源失败:Access-Control-Allow-Origin 不允许 Origin null” 更多信息 -> Information on IE 和 Information on Chrome(查找 --allow-file-access-from-files)

IE 的一个有趣之处在于,如果您使用的是 .NET 浏览器 WinForm 或 Silverlight 应用程序内部的控件,此功能是 禁用,您将不会遇到同样的问题。

我知道有几个解决方法 - 没有一个是理想的,因为它们会禁用安全保护措施

IE:第一个也是最“良性”的是,您可以将调用页面的 URI 添加到受信任的站点区域(取消选中“启用保护模式”) IE:在上面的链接之后,您可以修改一个注册表设置,该设置将禁用此功能 - 但必须在每台尝试加载资源的机器上执行此操作 Chrome:上面的链接是指在启动 Chrome 时使用命令行开关来禁用该功能。

再次强调,这是浏览器中的一项安全功能,用于缓解潜在的威胁向量 - 类似于跨域脚本块。

【讨论】:

【参考方案5】:

试试this page。我通过以下方式解决了问题:

    通过终端在工作区目录/home/user/web_ws中启动一个http服务器:python -m SimpleHTTPServer它开始在0.0.0.0端口8000上提供HTTP服务。 .. 带有一些 GET 请求..

    然后我在浏览器中加载了我的网页(名为 check.html),网址为 http://localhost:8000/check.html。 所以,我的 file:///home/user/web_ws/ 被转换为 http://localhost:8000/)。

    接下来是通过 Sources 选项卡(从 Inspector 停靠栏)设置我的工作区。我刚刚将我的 Workspace 文件夹添加到 Sources 工作区,之后一切正常。

-喜满树

(我不是网络开发人员,只是对 html、xml、css、js 等有一点了解,只是碰巧尝试了我的一个使用 xml 文件的项目。如果我是某处不正确,发表评论,学习愉快;-)

【讨论】:

以上是关于在 IE XMLHttpRequest 中读取文件:// URL的主要内容,如果未能解决你的问题,请参考以下文章

[XMLHttpRequest访问被拒绝,但试图从Web服务器位置访问文件-IE8

文件 API 文件上传 - 在 ASP.NET MVC 中读取 XMLHttpRequest

用回调函数创建一个XMLHttpRequest,并从一个TXT文件中检索数据。

IE 中的 XMLHttpRequest.responseURL

XmlHttpRequest 在 IE 中是不是比在 Chrome 中花费更多时间?

IE 11 错误 - 访问被拒绝 - XMLHttpRequest