2009-10-08 14 views
6

Pobieram plik dynamiczny w mojej aplikacji, symulując ajax przy użyciu elementów iframe. Kiedy robię żądanie pobierania, utworzę dynamiczny niewidoczny element iframe i ustawię src mojego elementu iframe jako URL pobierania. Mogę pobrać plik, ale wymagane jest pokazanie pobierania wskaźnik po rozpoczęciu pobierania, który powinien zakończyć się zaraz po pojawieniu się okna dialogowego pobierania. Zapewniłem oddzwonienie po utworzeniu elementu iframe, aby pokazać wskaźnik pobierania, który działał poprawnie, i podałem inną metodę na "onload" elementu iframe, oczekując zostanie wywołany, gdy pojawi się okno pobierania. Ale niestety to nie działa, a z tego powodu nawet po zakończeniu pobierania mój wskaźnik postępu nadal istnieje. Nie jestem w stanie tego usunąć. Potem uświadomiłem sobie, że skoro typem treści odpowiedzi nie jest html, to będzie obsługiwany przez oddzielny proces, który prowadzi do okna dialogowego pobierania i z tego powodu moja metoda onload nigdy nie jest wywoływana. Daj mi znać rozwiązanie tego problemu.Pobieranie pliku Ajax Problem

Odpowiedz

1

należy zacząć czasomierza w kliencie, gdy żądanie pobrania składa który sprawdza stan iframe w określonym przedziale:

if ((iframe.document && iframe.document.readyState == 'complete') 
    || iframe.contentDocument) 
{ 
    stopTimer(); 
    closePopupDialog(); 
} 
+0

Powyżej jest bardzo blisko rozwiązania, ale w moim przypadku, readyState nigdy nie osiągnęło "kompletnego" nawet po pobraniu, pozostało w stanie "interaktywnym". Any idea what was problem? – Bibin

+0

właśnie się dowiedział, że dyspozycja treści odgrywa w tym rolę. Sprawdź ** [this] (http://www.atalasoft.com/cs/blogs/jake/archive/2009/06/18/events-to-expect-when-dynamically-loading-iframes-in-javascript. aspx) ** – Bibin

+0

Ta metoda * niestety * nie działa z powodu niestałego zachowania readyState w różnych przeglądarkach. Na przykład Chrome nigdy się nie zmienia. –

0

Możesz użyć menedżera pobierania flash - google ujawni ich mnóstwo.

Inną opcją jest użycie prawdziwej technologii AJAX. Wystarczy złożyć żądanie do identyfikatora URI pobierania, a gdy otrzymasz odpowiedź, użyj responseBody zamiast atrybutu responseText obiektu XMLHTTPRequest.

Musisz sposób, aby napisać, że na twardym dysku, które można zrobić w IE z lax ograniczeń związanych z bezpieczeństwem i ActiveXObject „Scripting.FileSystemObject” może być w stanie korzystać z podejścia uri danych: http://en.wikipedia.org/wiki/Data_URI_scheme z base64 kodowanie, ale nie jestem pewien, czy to zadziała.

W przeciwnym razie wrócisz do flashowania, aby zapisać dane pobrane przez ajax na dysk.

Jeśli wiesz, że rozmiar dynamicznego pobierania i dokładny czas nie są wymagane w specyfikacji, możesz wykonać sprawdzenie szybkości Internetu przed pobraniem, dodać trochę czasu buforowego do obliczonego czasu, który będzie potrzebny, aby pobrać plik i po prostu pokaż okno dialogowe dla danego okresu. Bardzo hackish, ale potem znowu ten system wydaje się nieco marketing-wymaga-to-do-tak-to-musi-być

15

Utworzyłem jQuery File Download plugin (Demo), który również rozwiązuje problem i zapewnia inne przydatne funkcje. Zasadniczo daje to "pełne doświadczenie w stylu Ajax" do pobierania plików (w tym nawet wywołań zwrotnych), które zwykle nie jest możliwe do pobrania plików.To działa bardzo podobnie do niektórych innych odpowiedzi z iframe, ale ma kilka ciekawych funkcji, które znalazłem bardzo przydatny:

  • Użytkownik nie opuszcza tę samą stronę one zainicjowane pobieranie plików od tego, czy uda się czy nie jest błędem
  • successCallback i failCallback funkcje pozwalają Ci być jawne, co zachowanie UI jest w każdej sytuacji
  • w połączeniu z jQuery UI programista może łatwo pokazać modalne informując użytkownika, że ​​pobieranie plików jest występującą, rozwiązał modal po rozpoczęciu pobierania lub nawet poinformowania użytkownika w przyjazny sposób, że wystąpił błąd. Zobacz przykład tego: Demo.

Oto prosty przykład użycia demo za pomocą wtyczki source z obietnicami. demo page zawiera również wiele innych przykładów "lepszego UX".

$.fileDownload('some/file.pdf') 
    .done(function() { alert('File download a success!'); }) 
    .fail(function() { alert('File download failed!'); }); 
Powiązane problemy