Я исчерпывающе исследовал эту проблему на стековом потоке, а также на других сайтах.В Javascript и IE есть несколько сообщений об ошибках «отказано в разрешении», но ни одна из них не пролила свет на мою конкретную проблему.
Я разработал сайт с использованием PHP в 2009 году для клиента, который помогает им отслеживать продуктинвентарь.Одной из предоставляемых функций является возможность создания нового продукта и назначения изображения, которое требует от них загрузки файла изображения.Возможность для них редактировать изображение существующего продукта таким же образом, также существует.Это делается с помощью всплывающего окна, которое открывается всякий раз, когда пользователь нажимает кнопку «Загрузить» для изображения товара.Код родительского окна выглядит следующим образом:
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.На самом деле, раньше он работал в IE7, когда я изначально разрабатывал это в 2009 году. Теперь действительно работает только создание нового продукта, хотя HTML, который отображается в скрипте PHP, вызываемом при выполнении загрузки, не отображается в IE (большеоб этом позже).Основная проблема возникает в IE, когда пользователь нажимает кнопку «загрузить» в родительском окне при редактировании существующего продукта.Консоль сценариев IE отображает ошибку «Отказано в доступе» в следующей строке:
win.targetField = thisForm.image;
Я пробовал несколько вещей, в том числе обеспечение того, что проблемы между доменами не являются фактором.URL, открываемые во всплывающем окне, очевидно, находятся в одном домене.Я изменил настройки безопасности в IE, чтобы «разрешить междоменный доступ».Любопытно, что проблема «отказано в разрешении» возникает только при редактировании изображения существующего продукта, хотя редактирование существующего и создание нового продукта совместно используют один и тот же Javascript, несмотря на то, что это разные файлы PHP.
тот факт, что HTML, отраженный PHP, выполняющим фактическую загрузку файла, не появляется во всплывающем окне.Вот этот 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, когда оно было впервые разработано.
Я знаю, что это длинный пост, и я, вероятно, слишком усложняю вещи, но для меня это непонятная проблема.Надеюсь, это что-то маленькое, чего я просто не вижу.Я ценю любые предложения сообщества.Заранее спасибо.