Как обеспечить (в IE и Firefox) загрузку двоичного файла во всплывающем окне, которое закрывается? - PullRequest
5 голосов
/ 07 мая 2009

Мне нужно кросс-браузерное решение для следующего варианта использования: Пользователь нажимает кнопку «экспорт» на одной из наших страниц, которая открывает всплывающее окно с формой. При отправке формы пользователь должен получить загрузку двоичного файла (например, CSV-файл), и всплывающее окно должно закрыться без изменения видимого содержимого родительского окна.

Мы не можем использовать тайм-аут, чтобы закрыть всплывающее окно, потому что обычно есть диалоговое окно, спрашивающее пользователя, как обработать файл перед его загрузкой, и нет способа узнать, сколько времени потребуется пользователю для обработки этого диалога.

Изначально у нас во всплывающем окне был скрипт, который устанавливает в window.location URL-адрес загружаемого файла. Это оставляет всплывающее окно закрытым.

Итак, я попытался поместить скрытый iFrame в родительское окно и заставить всплывающее окно установить src iFrame на URL загрузки перед вызовом self.close (). Это прекрасно работает в Firefox, но IE полностью устраняет ограничения безопасности.

Есть ли правильный способ сделать это? Как насчет того, как это работает в IE?


Обновление - проблема решена

Ответы, предложенные здесь, были не слишком далеки, но моя проблема была немного сложнее, чем просто проблема с Javascript. Я столкнулся с ошибками в IE и Excel (поскольку загружаемый файл - CSV), а всплывающее окно делало пост в форме.

Я не смог решить проблему, не добавив данные формы в URL (для GET вместо POST), и мне пришлось установить сайт как надежный в IE (это корпоративное приложение, так что это разумный запрос сделать из пользователей).

При нажатии кнопки формы всплывающее окно вызывает функцию для window.opener, передавая форму и ее URL-адрес действия. Затем всплывающее окно вызывает window.close (). Функция добавляет данные формы к URL-адресу и задает window.location для нового URL-адреса (идея iFrame никогда не работала хорошо в IE и, видимо, в этом не было необходимости).

В ответе на URL формы заголовки запроса включают Content-Type: application / octetstream и Content-Disposition "," attachment; имя файла = filename.csv».

Ответы [ 3 ]

1 голос
/ 07 мая 2009

Пытались ли вы в решении iframe фактически вызвать метод внутри родительского окна, который, в свою очередь, установит местоположение iframe? Я спрашиваю, потому что это сработало в моих тестах:

Родительское окно

<html>
<head>
<script type="text/javascript">
var w;

var download = function() {
    document.frames[0].location = "test.php";
    w.close();
};

var o = function() {
    w = window.open("test2.html", "window_name");
    return false;
};
</script>
</head>
<body>

<a href="#" onclick="return o();">open</a>

<iframe></iframe>

</body>
</html>

Всплывающее окно

<html>
<head>
<script type="text/javascript">
var download = function() {
    window.opener.download();
    return false;
};
</script>
</head>
<body>

<a href="#" onclick="return download();">download</a>

</body>
</html>

test.php - это просто страница, которая вынуждает файл для загрузки, и обратите внимание, что приведенный выше код специфичен для IE, так как я использую объект document.frames, но это легко сделать кросс-браузер.

0 голосов
/ 23 июня 2009

Не существует идеального решения для этого. При загрузке файла в IE его всплывающее окно и в Firefox он прямо загружается

0 голосов
/ 07 мая 2009

Это может быть способ решения проблемы.

1) Всплывающая форма onsubmit делает window.open к третьему окну, которое открывает страницу, которая является пустой страницей, которая просто возвращает загруженный файл.

2) В вашем javascript во всплывающей форме сразу после того, как вы выполните window.open, вызовите метод родительского окна (1-е окно), который закрывает всплывающую форму отправки.

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

Вот некоторая информация о заголовке, который вам может понадобиться. Код написан на классическом доисторическом ASP, но вы должны иметь возможность подсвечивать то, что вам нужно.

http://classicasp.aspfaq.com/general/how-do-i-prompt-a-save-as-dialog-for-an-accepted-mime-type.html

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...