6 Stimmen

Ajax-Dateidownload Problem

Ich lade eine dynamische Datei in meiner Anwendung herunter und simuliere Ajax unter Verwendung von iframes. Was ich mache ist, wenn die Download-Anfrage gemacht wird, werde ich ein dynamisches unsichtbares iframe erstellen und die src meines iframes als die Download-URL setzen. Ich kann die Datei erfolgreich herunterladen, aber die Anforderung ist, einen Download-Indikator anzuzeigen, sobald der Download startet und dieser sollte beendet sein, sobald der Download-Dialog erscheint. Ich habe nach der Erstellung des iframes einen Rückruf bereitgestellt, um den Download-Indikator anzuzeigen, der erfolgreich funktioniert, und habe eine weitere Methode auf dem 'onload' des iframes bereitgestellt, in der Erwartung, dass sie aufgerufen wird, wenn der Download-Dialog erscheint. Aber leider funktioniert das nicht, und deshalb ist auch nach Abschluss des Downloads mein Fortschrittsanzeiger noch da. Ich bin nicht in der Lage, das zu entfernen. Dann wurde mir klar, dass da der Inhaltstyp der Antwort kein HTML ist, er von einem separaten Prozess bereitgestellt wird, der zum Download-Dialog führt und deshalb meine onload-Methode nie aufgerufen wird. Bitte lassen Sie mich eine Lösung für dieses Problem wissen.

15voto

John Culviner Punkte 20761

Ich habe das jQuery-File-Download-Plugin erstellt (Demo), das auch das Problem behebt und einige andere nützliche Funktionen bietet. Es bietet praktisch eine "vollständige Ajax-ähnliche" Erfahrung für Datei-Downloads (inklusive Callbacks), die normalerweise bei Datei-Downloads nicht möglich ist. Es funktioniert ziemlich ähnlich wie einige andere Antworten mit einem iframe, bietet aber einige coole Funktionen, die ich ziemlich praktisch gefunden habe:

  • Der Benutzer verlässt niemals die gleiche Seite, von der aus er einen Dateidownload initiiert hat, egal ob erfolgreich oder mit einem Fehler.
  • successCallback- und failCallback-Funktionen ermöglichen es Ihnen, explizit anzugeben, wie das UI-Verhalten in beiden Situationen sein soll.
  • In Verbindung mit jQuery UI kann ein Entwickler leicht ein Modalfenster anzeigen, das dem Benutzer mitteilt, dass ein Dateidownload stattfindet, das Modalfenster nach dem Start des Downloads auflöst oder den Benutzer freundlich informiert, wenn ein Fehler aufgetreten ist. Sehen Sie sich die Demo für ein Beispiel davon an.

Hier ist eine einfache Beispiel-Demo zur Verwendung des Plugins Quellcode mit Promises. Die Demo-Seite enthält auch viele andere Beispiele für eine 'bessere Benutzererfahrung'.

$.fileDownload('some/file.pdf')
    .done(function () { alert('Dateidownload erfolgreich!'); })
    .fail(function () { alert('Dateidownload fehlgeschlagen!'); });

2voto

Diego Punkte 21

1voto

prasad Punkte 11

Sieh dir das an, es könnte dir helfen

http://code.msdn.microsoft.com/AjaxFileDownload

1voto

Dave Spurling Punkte 26

Sie sollten einen Timer im Client starten, wenn die Download-Anforderung gesendet wird, der den Zustand des Iframe in einem festgelegten Intervall überprüft:

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

0voto

Marcus Pope Punkte 2283

Sie können einen Flash-Download-Manager verwenden - Google wird eine Vielzahl davon zeigen.

Ihre andere Option ist, echtes AJAX zu verwenden. Machen Sie einfach eine Anfrage an den Download-URI, und wenn Sie Ihre Antwort erhalten, verwenden Sie das responseBody anstelle des responseText-Attributs des XMLHTTPRequest-Objekts.

Sie benötigen eine Möglichkeit, das auf die Festplatte zu schreiben, was in IE mit laxen Sicherheitseinschränkungen und dem ActiveXObject "Scripting.FileSystemObject" erfolgen kann. Möglicherweise können Sie den Daten-URI-Ansatz verwenden: http://en.wikipedia.org/wiki/Data_URI_scheme mit einer Base64-Codierung, aber ich bin mir nicht sicher, ob das funktioniert.

Ansonsten müssen Sie wieder auf Flash zurückgreifen, um die per Ajax heruntergeladenen Daten auf die Festplatte zu schreiben.

Wenn Sie die Größe des dynamischen Downloads kennen und die genaue Zeit nicht in der Spezifikation erforderlich ist, könnten Sie vor dem Download einen Internetgeschwindigkeitstest durchführen, etwas Pufferzeit zur berechneten Downloadzeit hinzufügen und einfach den Dialog für diesen Zeitraum anzeigen. Sehr hackisch, aber dieses Schema scheint ein wenig zu sein, dass es vom Marketing erfordert wird: es soll sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X