Ich habe eine Aktionsklasse, die ein PDF generiert. Das contentType
ist entsprechend eingestellt.
public class MyAction extends ActionSupport
{
public String execute() {
...
...
File report = signedPdfExporter.generateReport(xyzData, props);
inputStream = new FileInputStream(report);
contentDisposition = "attachment=\"" + report.getName() + "\"";
contentType = "application/pdf";
return SUCCESS;
}
}
Ich rufe dies action
über einen Ajax-Anruf an. Ich weiß nicht, wie ich diesen Stream an den Browser senden kann. Ich habe ein paar Dinge ausprobiert, aber nichts hat funktioniert.
$.ajax({
type: "POST",
url: url,
data: wireIdList,
cache: false,
success: function(response)
{
alert('got response');
window.open(response);
},
error: function (XMLHttpRequest, textStatus, errorThrown)
{
alert('Error occurred while opening fax template'
+ getAjaxErrorString(textStatus, errorThrown));
}
});
Das obige gibt den Fehler:
Ihr Browser hat eine Anfrage gesendet, die dieser Server nicht verstehen konnte.
quelle
content-disposition
istattachment
, erhalten Sie nur einenSave as
Dialog. Die übergeordnete Seite bleibt unverändert. Nur<a href="pdfservlet/filename.pdf">pdf</a>
oder a<form action="pdfservlet/filename.pdf"><input type="submit"></form>
ist mehr als genug.POST
Daten zu erstellen.Hier ist, wie ich das zum Laufen gebracht habe
Aktualisierte Antwort mit download.js
quelle
Ich glaube nicht, dass eine der früheren Antworten das Problem des Originalplakats aufgedeckt hat. Sie alle setzen eine GET-Anfrage voraus, während das Poster versuchte, Daten zu POSTEN und als Antwort einen Download zu erhalten.
Auf der Suche nach einer besseren Antwort haben wir dieses jQuery-Plugin zum Anfordern von Ajax-ähnlichen Dateidownloads gefunden .
In seinem "Herzen" erstellt es ein "temporäres" HTML-Formular, das die angegebenen Daten als Eingabefelder enthält. Dieses Formular wird an das Dokument angehängt und an die gewünschte URL gesendet. Gleich danach wird das Formular wieder entfernt:
Update Mayurs Antwort sieht im Vergleich zu dem von mir genannten jQuery-Plug-In ziemlich vielversprechend und sehr einfach aus.
quelle
So löse ich dieses Problem.
Die Antwort von Jonathan Amend auf diesen Beitrag hat mir sehr geholfen.
Das folgende Beispiel ist vereinfacht.
Für weitere Details kann der obige Quellcode eine Datei mithilfe einer JQuery Ajax-Anforderung (GET, POST, PUT usw.) herunterladen . Es hilft auch, Parameter als JSON hochzuladen und den Inhaltstyp in application / json (meine Standardeinstellung) zu ändern .
Die HTML- Quelle:
Ein einfaches Formular mit zwei Eingabetexten, einem Auswahl- und einem Schaltflächenelement.
Die Quelle der Javascript-Seite :
Ein einfaches Ereignis beim Klicken auf die Schaltfläche. Es wird ein AjaxDownloadFile-Objekt erstellt. Die AjaxDownloadFile-Klassenquelle befindet sich unten.
Die AjaxDownloadFile-Klassenquelle :
Ich habe diese Klasse erstellt, um sie meiner JS-Bibliothek hinzuzufügen. Es ist wiederverwendbar. Hoffentlich hilft das.
quelle
Blob
Objekt wird in IE10 + unterstützt.responseType
von xhr aufarraybuffer
oder setzen,blob
damit dies funktioniert. (Ansonsten funktioniert dasWas für mich funktioniert hat, ist der folgende Code, während die Serverfunktion abruft
File(memoryStream.GetBuffer(), "application/pdf", "fileName.pdf");:
quelle
Sie können dieses Plugin verwenden, das ein Formular erstellt, es sendet und dann von der Seite entfernt.
Das hat bei mir funktioniert. Fand dieses Plugin hier
quelle
Der folgende Code hat bei mir funktioniert
quelle
Um das leere PDF-Problem in der Post-Anfrage zu beheben und Stream-Daten wie PDF abzurufen, müssen Sie den Antworttyp als "Array-Puffer" oder "Blob" in der Anfrage hinzufügen
quelle
In Bezug auf die Antwort von Mayur Padshala ist dies die richtige Logik, um eine PDF-Datei über Ajax herunterzuladen. Wie andere in den Kommentaren berichten, wird bei dieser Lösung tatsächlich ein leeres PDF heruntergeladen.
Der Grund hierfür liegt in der akzeptierten Antwort auf diese erklärt Frage : jQuery hat einige Probleme Laden Binärdaten AJAX - Anforderungen verwenden, da es noch nicht , einige HTML5 XHR v2 - Funktionen zu implementieren, diese Erweiterung sehen Anforderung und diese Diskussion .
Die Verwendung
HTMLHTTPRequest
des Codes sollte also folgendermaßen aussehen:quelle
Erstellen Sie einen versteckten Iframe und dann in Ihrem Ajax-Code oben:
url:
document.getElementById('myiframeid').src = your_server_side_url
,und entfernen Sie die
window.open(response);
quelle
Dieses Snippet ist für eckige js-Benutzer gedacht, bei denen das gleiche Problem auftritt. Beachten Sie, dass die Antwortdatei mithilfe eines programmierten Klickereignisses heruntergeladen wird. In diesem Fall wurden die Header vom Server gesendet, der Dateiname und Inhalt / Typ enthielt.
quelle
Müssen Sie es mit Ajax machen? Könnte es nicht eine Möglichkeit sein, es in einen Iframe zu laden?
quelle
Ich hoffe, dies erspart Ihnen ein paar Stunden und erspart Ihnen Kopfschmerzen. Es hat eine Weile gedauert, bis ich das herausgefunden habe, aber die reguläre Anfrage von $ .ajax () hat meine PDF-Datei ruiniert, während die Anfrage über die Adressleiste perfekt funktioniert hat. Die Lösung war folgende:
Fügen Sie download.js hinzu: http://danml.com/download.html
Verwenden Sie dann XMLHttpRequest anstelle der Anforderung $ .ajax ().
quelle
quelle
Wenn Sie wie wir mit Dateistreams arbeiten müssen (also keine physisch gespeicherten PDF-Dateien) und die PDF-Datei ohne erneutes Laden der Seite herunterladen möchten, funktioniert die folgende Funktion für uns:
HTML
Javascript
Aufgrund des Ziels = "pdf-download-output" wird die Antwort in den iframe geschrieben und daher wird kein erneutes Laden der Seite ausgeführt, sondern der pdf-response-stream wird im Browser als Download ausgegeben.
quelle