Загрузка файла из всплывающего окна - сломан в IE9, работает в других местах - PullRequest
2 голосов
/ 21 декабря 2011

В течение нескольких лет мы использовали домашний загрузчик файлов для нашего классического веб-сайта ASP. Это работает так:

  1. Страница ASP устанавливает некоторые конкретные константы и включает в себя библиотеку ASP с именем Browse-Files.asp.
  2. Browse-Files.asp отображает внутри страницы #include каталогоподобный просмотр каталогов и файлов в каталоге. Он также показывает различные ссылки HTML, чтобы разрешить функции модификации файла - создать каталог, загрузить файл, переместить, переименовать и удалить существующие файлы.
  3. Каждая из этих ссылок вызывает функцию Javascript, которая генерирует простую HTML-страницу во всплывающем окне. Эти всплывающие окна содержат требуемую HTML-форму для запрашиваемой операции изменения файла. Исходный HTML-код для всплывающих страниц генерируется на лету Javascipt, а не загружает статический файл .htm или .asp (это сделано для того, чтобы все функции Browse-Files.asp находились в 1 файле).
  4. Пользователь заполняет всплывающую форму и отправляет. Форма отправляется обратно на родительскую страницу (целевой атрибут формы) и закрывается (Javascript timer, window.close).
  5. Родительская страница обновляется в связи с отправкой формы, показывая изменения, запрошенные пользователем.

Проблема в том, что в течение нескольких лет это работало нормально в различных браузерах, IE 6-8, Firefox и Opera. Однако в IE9 загрузка файла не работает. Другие всплывающие задачи, такие как переименование файлов и создание каталогов, продолжают работать.

Код - всплывающее окно переименования файлов (работает в IE9 и ранее):

<html>
<head>
<title>Rename</title>
<link rel="stylesheet" href="/Common/CSS/screen.css" type="text/css" media="screen" />
</head>
<body>
<h1>Rename</h1>
<p>Enter the new name for "Config Mgmt Text.txt" in the folder "General/Share-Files/":</p>
<form name="form" method="post" action="/General/Share-Files.asp" encType="multipart/form-data" target="Browse-Files" onSubmit="self.setTimeout('window.close()', 500)">
<input name="task" type="hidden" value="T03" />
<input name="path" type="hidden" value="General/Share-Files/" />
<input name="target" type="hidden" value="Config Mgmt Text.txt" />
<input name="name" type="text" tabindex="1" size="40" value="Config Mgmt Text.txt"></input>
<input name="submit" type="submit" value="Rename" tabindex="2" />
</form>
</body>
</html>

Код - всплывающее окно загрузки файла (не работает в IE9, все работает раньше):

<html>
<head>
<title>Add Files</title>
<link rel="stylesheet" href="/Common/CSS/screen.css" type="text/css" media="screen" />
</head>
<body>
<h1>Add Files</h1>
<p>Browse for files to add to the folder "General/Share-Files/":</p>
<form name="form" method="post" action="/General/Share-Files.asp" encType="multipart/form-data" target="Browse-Files" onSubmit="self.setTimeout('window.close()', 500)">
<input name="task" type="hidden" value="T01" />
<input name="path" type="hidden" value="General/Share-Files/" />
<input name="file1" type="file" tabindex="1" size="40"></input><br />
<input name="file2" type="file" tabindex="2" size="40"></input><br />
<input name="file3" type="file" tabindex="3" size="40"></input><br />
<input name="file4" type="file" tabindex="4" size="40"></input><br />
<input name="file5" type="file" tabindex="5" size="40"></input><br />
<input name="submit" type="submit" value="Upload Files" tabindex="6" />
</form>
<p>Note that upload speed depends on your internet connection speed.</p>
</body>
</html>

Все формы encType="multipart/form-data" для размещения файла, а ASP на главной странице Request.BinaryRead(Request.TotalBytes) первым делом обращается с данными формы. Затем он анализирует данные по разделителю, разбивая их на двоичные данные (загруженные файлы) и текстовые данные (обычные поля формы). Одно из этих обычных полей формы, <input name="task" type="hidden" value="T01" />, - это то, как оно знает, что делать с отправленными данными (переименовать файл, загрузить файл и т. Д.).

Итак, почему загрузка и только загрузка не работает в IE9?

Как и выше, метод отправки формы такой же для загрузки и других (рабочих) действий формы, как и для анализа HTTP POST на стороне сервера.

Отладка показала, что всплывающее окно загрузки файла даже не передает данные обратно на родительскую страницу (или на себя), т. Е. Данные формы никогда никогда не отправляются на сервер. Но все остальные формы работают одинаково и делают отправка .....

Может ли это быть что-то совершенно не связанное с кодом, например настройка безопасности IE9?

Даже пытались принудительно установить режим совместимости IE8 на IE9 (<meta http-equiv="X-UA-Compatible" content="IE=8" >), без изменений.

Любая помощь с благодарностью.

Спасибо

Lukas

Обновление:

1) «Не работает» означает, что всплывающее окно загрузки исчезает при отправке (как и должно быть), но ничто никогда не отправляется на родительскую страницу. Если я отключаю автоматическое закрытие всплывающего окна: после нажатия кнопки «Отправить» текстовые поля, содержащие путь к файлу (файлам) для загрузки, очищаются, но больше ничего не происходит. Это говорит о том, что он отправляется на всплывающую страницу, а не на родительскую страницу, но на самом деле это не имеет смысла, поскольку другие (работающие под IE9) всплывающие страницы по-прежнему правильно отправляются на родительскую страницу. Я попытаюсь заменить сгенерированную JS всплывающую страницу обычной страницей ASP, которая может отображать любые данные HTTP POST, и перейду оттуда.

2) Если я включаю режим совместимости на стороне клиента (кнопка просмотра совместимости IE9), работает точно так, как должно. Это скорее обходной путь, чем исправление. Я полагаю, что это исключает настройки браузера, поскольку режим совместимости влияет только на рендеринг страницы?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Я смог решить эту проблему в Windows7 и IE9 (работал во всех других браузерах и версиях, которые я мог протестировать), убедившись, что в первом атрибуте инициирующего вызова window.open () есть жизнеспособный URL-адрес.

На самом деле я write () собирался открыть открытое окно, чтобы вставить в него нужный мне код, который включал форму загрузки файла.Таким образом, у меня не было URL, который я должен был объявить в открывшемся окне.В адресной строке сказано «о: пусто».Далее, нажав F12 в окне, я мог видеть, что я получаю ошибку «SCRIPT5: доступ запрещен» , когда я пытался отправить форму.

Я вызывал всплывающее окнонапример:

var popup_window = window.open("","upload_popup_window_name","menubar=1,resizable=1,scrollbars=1,width=630,height=400");

Изменив вышеприведенное значение на:

var popup_window = window.open("/blank.html","upload_popup_window_name","menubar=1,resizable=1,scrollbars=1,width=630,height=400");

Где /blank.html был фактическим файлом, который веб-сервер возвратил код 200по запросу (хотя на самом деле это может быть источник URL, который вы хотите вызвать, я предполагаю, что если вы уже сделали это таким образом, это сработает).

Я все еще переписал содержимоеwindow by by document.write () вставляя весь мой собственный код в окно так, как я это делал ранее.

Сделав эту небольшую модификацию, IE9 затем разрешил загрузку файлов ИНИЦИАТИРОВАТЬ всплывающим окном, и я больше не получал ошибку «SCRIPT5: доступ запрещен».И файлы снова начали успешно загружаться.

Надеюсь, это поможет

0 голосов
/ 21 декабря 2011

То есть, т. Е. 9 регистр чувствителен к вашим атрибутам формы?

попробуйте изменить:

encType="multipart/form-data"

до:

enctype="multipart/form-data"

и очистите кеш.

...