2009-05-07 3 views
5

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

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

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

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

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


Update - проблема решена

Ответы, предложенные здесь не были слишком далеко, но моя проблема была немного сложнее, чем просто вопрос 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».

+0

будет ли оно работать, чтобы либо поместить форму на исходную страницу, либо открыть новую страницу для открытия в iframe (который может быть создан из самого скрипта)? – Anonymous

+0

В ответ на Аноним - я думаю, что вы описываете, это то, что я сделал. Всплывающее окно при создании и начальной загрузке фактически записывает невидимый iFrame на родительскую страницу. Когда форма отправляется во всплывающее окно, она направляет iFrame для загрузки файла загрузки. Мой IE (IE 6) заблокировал это и заставил меня подтвердить загрузку в родительском окне. При подтверждении он пытается повторно отправить родительскую форму окна, которая вызывает другое диалоговое окно подтверждения и, как правило, испортит его. –

+0

Я подумывал представить форму iframe, которая избавляется от затяжной всплывающей проблемы. – Anonymous

ответ

0

Это может быть способ подойти к проблеме.

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

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

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

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

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

Надежда, что помогает.

+0

Я не уверен, что шаг 1 будет работать в моем случае, потому что представление формы во всплывающем окне фактически создает файл для загрузки и называет его. Пока я не получу результаты этого представления, я не могу открыть третье окно, потому что не знаю URL загрузки. Это решаемая проблема, но я надеялся не прикасаться к самому сервлете загрузки файлов, так как это ошибка в конце цикла разработки. –

1

Вы пытались в решении 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

Во время генерации родительской страницы URL-адрес загрузки файла неизвестен. Я предполагаю, что он может быть передан функции download(). Мне придется попробовать это (в начале следующей недели, из-за моего графика). –

+0

Включение функции download() в открывателе не помогло. IE все еще блокирует и полностью управляет процессом загрузки. Следующим шагом для меня является попытка загрузки формы в iFrame, а не в всплывающее окно. –

+0

Какая версия IE? –

-1

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