2009-05-07 14 views
5

Potrzebuję rozwiązania dla różnych przeglądarek do następującego przypadku użycia: Użytkownik klika przycisk "eksport" na jednej z naszych stron, co powoduje otwarcie wyskakującego okienka z formularzem. Po przesłaniu formularza użytkownik powinien otrzymać plik binarny do pobrania (na przykład plik CSV), a okno podręczne powinno zostać zamknięte bez zmiany widocznej zawartości okna nadrzędnego.Jak zapewnić (w IE i Firefox) pobranie pliku binarnego w popupie, który się zamyka?

Nie możemy użyć limitu czasu, aby zamknąć popup, ponieważ zazwyczaj istnieje okno dialogowe z pytaniem użytkownika o obsługę pliku przed jego pobraniem, a nie ma możliwości sprawdzenia, jak długo zajmie użytkownikowi obsłużenie tego okna dialogowego .

Pierwotnie mieliśmy skrypt w popup, który ustawia window.location do adresu URL pliku do pobrania. To pozostawia niezamknięte okienko.

Tak więc próbowałem umieścić ukrytą ramkę iFrame w oknie nadrzędnym i mając wyskakujące okienka ustawić src iFrame na URL pobierania przed wywołaniem self.close(). Działa to doskonale w Firefoksie, ale IE całkowicie niszczy go ograniczeniami bezpieczeństwa.

Czy jest to właściwy sposób? Co powiesz na sposób, który działa na IE?


Aktualizacja - problem rozwiązany

Odpowiedzi proponowane tutaj nie były zbyt daleko, ale mój problem był nieco bardziej skomplikowane niż tylko bycie Javascript problem. Napotkałem błędy w IE i Excelu (ponieważ plik do pobrania to CSV), a popup robił post.

Nie mogłem rozwiązać problemu bez dołączania danych formularza do adresu URL (w przypadku GET zamiast POST), i muszę ustawić witrynę jako zaufaną w IE (jest to aplikacja dla przedsiębiorstw, więc jest to uzasadnione wniosek do użytkowników).

Po kliknięciu przycisku formularza wyskakujące okienko wywołuje funkcję na window.opener, przekazując w formularzu i adres URL działania. Następnie wyskakujące wywołania window.close(). Funkcja dodaje dane formularza do adresu URL i ustawia window.location na nowy adres URL (idea iFrame nigdy nie działała dobrze w IE i najwyraźniej nie była konieczna).

W odpowiedzi na adres URL formularza, nagłówki żądań zawierają: Content-Type: application/octetstream i Content-Disposition "," attachment; filename = plik.csv”.

+0

byłoby działać, aby umieścić formularz na oryginalnej stronie lub skierować nową stronę do otwarcia w iframe (która mogłaby zostać wygenerowana przez sam skrypt)? – Anonymous

+0

W odpowiedzi na Anonim - myślę, że to, co opisujesz, jest czymś, co zrobiłem. Wyskakujące okienko po utworzeniu i początkowym załadowaniu faktycznie zapisuje niewidoczny element iFrame na stronie nadrzędnej. Gdy formularz zostanie przesłany w wyskakującym okienku, kieruje iFrame, aby załadować pobrany plik. Moja IE (IE 6) zablokowała to i zmusiła mnie do potwierdzenia pobierania w oknie nadrzędnym. Po potwierdzeniu próbuje ponownie przesłać formularz okna nadrzędnego, który wywołuje kolejne okno dialogowe potwierdzenia i generalnie je kasuje. –

+0

Zastanowiłem się nad przesłaniem formularza do elementu iframe, który pozbywa się problemu z wyskakującym wyskakującym okienkiem. – Anonymous

Odpowiedz

0

To może być sposób podejścia do problemu.

1) Forma Popup onsubmit robi window.open do trzeciego okna, które otwiera stronę, która jest pusta strona, która po prostu zwraca pobrany plik.

2) W swojej JavaScript w postaci podręcznego, tuż po wykonaniu metody window.open, zadzwoń do okna nadrzędnego (1st okno) metodę, która zamyka okienko złożyć formularz.

3) Na trzeciej stronie, która jest tylko stroną, która zwraca plik, możesz ustawić zawartość w swoim pliku nagłówkowym, aby tylko zwrócić plik i noth Inaczej, więc strona tak naprawdę nie otworzy się.

Oto niektóre informacje na temat nagłówka, którego możesz potrzebować. Kod znajduje się w klasycznej prehistorycznej ASP, ale powinieneś być w stanie błysnąć, czego potrzebujesz.

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

nadzieję, że pomoże.

+0

Nie jestem pewien, czy krok 1 zadziała w moim przypadku, ponieważ przesłanie formularza w popupie faktycznie generuje plik do pobrania i nadaje nazwę. Dopóki nie otrzymam wyników tego zgłoszenia, nie mogę otworzyć trzeciego okna, ponieważ nie znam adresu URL pobierania. Jest to rozwiązywalny problem, ale miałem nadzieję, że nie będę musiał dotykać samego serwletu pobierania plików, ponieważ jest to poprawka z opóźnieniem w naszym cyklu programowania. –

1

Czy w rozwiązaniu iframe próbowałeś wywołać metodę wewnątrz okna nadrzędnego, która z kolei ustawi lokalizację elementu iframe? Pytam dlatego, że pracował w moich testów:

nadrzędna okienne

<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> 

okno Popup

<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 jest tylko strona, która zmusza plik do pobrania, i proszę zauważyć, że powyższy kod jest specyficzny dla IE, ponieważ korzystam z obiektu document.frames, ale można go łatwo utworzyć w przeglądarce.

+0

W momencie generowania strony nadrzędnej adres URL pobierania pliku nie jest znany. Przypuszczam, że można go przekazać do funkcji download(). Będę musiał spróbować tego (na początku przyszłego tygodnia, ze względu na mój harmonogram). –

+0

Umieszczenie funkcji download() w otwieraczu nie naprawia rzeczy. IE nadal blokuje i całkowicie koduje proces pobierania. Następnym krokiem dla mnie jest próba załadowania formularza w iFrame zamiast w popup. –

+0

Jaką wersję IE? –

-1

Nie ma na to idealnego rozwiązania. Kiedy pobieranie pliku w IE jest wyskakujące iw firefoxie to bezpośrednio pobrane

Powiązane problemy