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
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();
}
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ć
Zobacz to może pomóc u
Zobacz to to może pomóc u
http://bytes.com/topic/javascript/answers/610641-file-download-ajax
tego właśnie szukałem. Dzięki ! :) – Tony
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!'); });
- 1. Pobieranie pliku AJAX z niestandardowym nagłówkiem
- 2. Pobieranie pliku za pomocą Java, Struts 2 i AJAX
- 3. Codeigniter ajax Problem CSRF
- 4. Pobieranie pliku PHP nie działa?
- 5. Rozpocznij pobieranie pliku po odświeżeniu
- 6. Pobieranie pliku binarnego
- 7. Pobieranie pliku zakończone oddzwonienie
- 8. Wybór2 nie pobieranie danych za pośrednictwem AJAX
- 9. Pobieranie danych z pliku XML
- 10. Pobieranie nazwy pliku Makefile z pliku Makefile
- 11. Pobieranie nazwy pliku z pliku pobierania http
- 12. Pobieranie dużego pliku - iPhone SDK
- 13. Pobieranie nazwy pliku dla ALAsset
- 14. C++: Pobieranie nieprawidłowego rozmiaru pliku
- 15. Pobieranie pliku przy użyciu selenu
- 16. Pobieranie pliku z/res/raw
- 17. Pobieranie pliku "mobileconfig" z aplikacji
- 18. Pobieranie pliku ASP.NET z serwera
- 19. ASP.NET: problem z danymi jQuery AJAX 'data'
- 20. Problem z przesyłaniem pliku
- 21. żądanie pobrania pliku Ajax żądania C# MVC
- 22. Pobieranie pliku CSV przy użyciu JSF
- 23. CasperJS - pobieranie wygenerowanego pliku bez adresu URL
- 24. Github API ... Pobieranie nazwy pliku źródłowego na przeniesiony/zmieniony plik
- 25. Problem IE7 - nie można pobrać przesyłanego pliku, gdy automatyczne monitowanie o pobieranie plików jest wyłączone
- 26. Przesyłanie pliku AJAX z Railsami
- 27. Przesyłanie pliku AJAX między domenami
- 28. Przesyłanie pliku z jQuery Ajax
- 29. jQuery Znaczniki (autouzupełnianie) lista Pobieranie JSON za pośrednictwem AJAX
- 30. Pobieranie pliku z DataURL w JavaScript
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
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
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. –