【发布时间】:2011-03-17 16:34:11
【问题描述】:
我已经在 stackoverflow 和其他网站上详尽地研究了这个问题。有几篇关于 Javascript 和 IE 中的“权限被拒绝”错误的帖子,但没有一个可以阐明我的特定问题。
我在 2009 年使用 PHP 为客户开发了一个网站,帮助他们跟踪产品库存。提供的一项功能是能够创建新产品并分配图像,这需要他们上传图像文件。他们以相同方式编辑现有产品图像的能力也存在。每当用户单击产品图像的“上传”按钮时,都会打开一个弹出窗口来完成此操作。父窗口的代码如下所示:
function openPopUp( thisForm )
{
var ProductId = thisForm.product_id.value;
var ProductName = thisForm.product_name.value;
var URL = "../imageupload/index.php?product_id=" + ProductId + "&product_name=" + ProductName;
var win = window.open ( URL, "imageUploadWindow", "location=0,status=1,scrollbars=1,width=700,height=600,resizeable=1,directories=0,toolbar=0");
win.targetField = thisForm.image;
win.focus();
}
这里是被调用的 openPopUp() 函数:
<form class="productForm" name="form" action="<?php $_SERVER['PHP_SELF'] ?>" method="POST">
...
<td class="maintable"><input type="text" name="image" readonly="readonly" size="20" />
<td class="maintable"><input type="button" value="Upload" name="imageButton" onclick="openPopUp(this.form)" />
...
</form>
这背后的想法是在父窗口上有一个文本类型的只读输入,它将获取图像文件名的值。用户成功上传图像后,该文件名将通过弹出窗口传回父窗口。用户将关闭弹出窗口,然后按父窗口中的“更新”按钮将产品的更新(包括图像文件名)提交到数据库。作为参考,这是弹出窗口中将文件名传递回父级的函数:
function setImageFileName ( fileName )
{
var opener = window.opener;
if ( opener && !opener.closed && opener.setTargetField )
{
var fileNameShort = /([^\\]+)$/.exec(fileName)[1];
opener.setTargetField ( targetField, fileNameShort );
}
}
这是弹出窗口中用于处理文件名选择和上传的 HTML:
<form action="upload.php" method="post" enctype="multipart/form-data">
<p>
<label for="file">Select a new image file:</label> <input type="file" name="imagefile" id="file"> <br />
<button onClick="setImageFileName(this.form.imagefile.value)">Upload File</button>
</p>
</form>
此代码在除 IE8 之外的任何浏览器中都能完美运行。事实上,当我在 2009 年最初开发时,它以前在 IE7 中工作。现在,只有创建一个新产品才能真正工作,尽管在执行上传时调用的 PHP 脚本回显的 HTML 不会出现在 IE 中(更多稍后再说)。当用户在编辑现有产品时按下父窗口中的“上传”按钮时,IE 中会出现主要问题。 IE 的脚本控制台在以下行反映了“Permission denied”错误:
win.targetField = thisForm.image;
我已经尝试了很多方法,包括确保跨域问题不是一个因素。在弹出窗口中打开的 URL 显然在同一个域上。我已将 IE 中的安全设置更改为“允许跨域访问”。奇怪的是,“权限被拒绝”问题只发生在编辑现有产品的图像时,尽管编辑现有产品和创建新产品共享相同的 Javascript,尽管它们是不同的 PHP 文件。
“权限被拒绝”问题的第二个问题是 PHP 执行实际文件上传时响应的 HTML 没有出现在弹出窗口中。这是PHP供参考:
if ( move_uploaded_file ( $_FILES['imagefile']['tmp_name'], $realpath . $filename ) )
{
chmod ( $realpath . $filename, 0755 );
echo "Your file upload was successful. New product image:<br /><br />";
echo "<img src=\"" . $imagePath . $filename . "\" alt=\"New image file\" title=\"New image file\" border=\"0\" />";
echo "<p>Remember to click the Update button for this product on the main page to finish your changes.</p>";
echo "<a href=\"javascript: self.close()\">Close</a>";
}
同样,这在其他浏览器中也能正常工作。当用户在弹出窗口中按下“上传文件”按钮时,上面的 PHP 会在弹出窗口中执行并按需要显示,但在 IE 中不会!弹出窗口的原始 HTML 仍然存在,给人的印象是没有发生上传,但实际上确实发生了。所有这些最初在 IE 最初开发时都可以使用。
我知道这是一篇很长的帖子,而且我可能把事情复杂化了,但这对我来说是一个令人困惑的问题。希望这是我看不到的小东西。我感谢社区可能提出的任何建议。提前致谢。
【问题讨论】:
标签: php javascript internet-explorer-8