在IE8中遇到“获取访问被拒绝”错误

46

我有一个HTML表单(upload.htm),其中包含一个HTML文件上传控件。

<form id="frmupload" name="upload" enctype="multipart/form-data" action="uploadhandler.ashx" method="post">
    <input id="uploader" name="uploadctrl" type="file"/>
</form>

上述页面中还有一个JavaScript方法,如下:

function performUpload(){
    document.getElementById('frmupload').submit();
}

我在一个页面(uploadpage.htm)内部通过一个 iframe 调用它:

<iframe id="docframe" src="upload.htm" style="display:none"></iframe>

我试图从 uploadpage.htm 页面执行下面显示的语句:

var i = document.getElementById('docframe');
i.contentWindow.performUpload();

我遇到了一个错误,提示访问被拒绝,并且我的调试器在我展示的第一个JavaScript函数处停止运行。这两个文件位于Web项目中相同的位置。它们也具有相同的域名。那么为什么我会得到这个错误呢?

当然,在之前,我可以发布页面:当我没有为HTML上传控件设置name属性时。但是在我在HTML标记中设置了名称属性之后,我遇到了这个奇怪的错误。为什么我第一次没有遇到这个问题呢?

查看了这篇帖子 -> "Access is denied" when script tries to access iframe in IE8,但并没有帮助。

3个回答

97

由于安全原因,IE不允许从JavaScript操作type="file"输入元素。设置文件名或调用单击事件以显示浏览器对话框将导致表单提交时出现“拒绝访问”错误 - Internet Explorer聪明地记住已调用的方法。

类似问题:http://www.webdeveloper.com/forum/showthread.php?t=181272


3
需要重新确认这个答案。我曾经疯狂地寻找我的表单上传问题所在,而实际上我在IE中使用了自定义文件输入,这导致了“访问被拒绝”的问题。非常有见地,谢谢。 - Conor Power
我错过了什么吗?这个小例子似乎证明了这个答案是错误的;使用 Ender/Bean 而不是 jQuery,我已经通过 JS 打开了文件选择器并将表单提交到一个生成的 iframe 中,它似乎可以工作:http://jsfiddle.net/NkycS/27/ - RwwL
5
哦,我明白了——我的文件输入框没有name属性。一旦我添加了一个,我确实会得到访问被拒绝的错误:http://jsfiddle.net/NkycS/32/。 - RwwL
这里有最佳答案:https://dev59.com/dXRB5IYBdhLWcg3wn4UL?noredirect=1&lq=1Josh Crozier的回答。 - agapitocandemor

13
传统上,由于安全问题,JavaScript 访问 HTML 中的 input type="file" 严重受限。据我所知,您无法使用 JS 执行文件上传元素的以下操作:
  1. 无法读取元素的“值”,因为它包含文件名。
  2. 无法通过 JS 启动文件选择菜单。
  3. 无法通过 JS 提交文件上传控件。
所有这些都是为了防止通过 JS 在后台窃取您的文件等恶意攻击。我有一段时间没用过 input type="file" 元素了,但我的最佳猜测是在其他浏览器中您也会遇到类似的问题(如果不是全部)。
你最好的选择是基于 Flash 或者一些新的 HTML5 控件。
此外,这是一个官方参考文献: http://msdn.microsoft.com/en-us/library/ms535263(v=vs.85).aspx 请在上述页面底部检查 "社区内容"。

0
在两个 HTML 文件中——一个包含框架,另一个是框架内的文件——尝试添加 document.domain='example.com',其中 'example.com' 是您的域名。

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