Wie die download-Datei von httpServlet mit Jquery?
In meiner Anwendung, ein json-Objekt erstellt wird auf der client-Seite. Dieses Objekt wird veröffentlicht HttpServlet erstellt eine pdf-Datei basierend auf der POST-Daten.
Die Datei schicken Sie zurück an den Benutzer. Der Erfolg Funktion aufgerufen wird, und stream-Daten wird protokolliert. Ich möchte jedoch, dass die Datei heruntergeladen wird.
Wie Sie diese erreichen?
Meine clientseitiger code:
$(document).ready(function() {
//when the print button is clicked
$('#exportButton').click(function() {
var tableIdx = performanceDetailTableController.getTableIdx();
var allData = {
"shipTable1":{
"rows":[
{ "latitude":"12323","longitude":"213213"},
{ "latitude":"213213","longitude":"543543"}
]},
"shipTable2":{
"rows":[
{ "latitude":"12323", "longitude":"213213"},
{ "latitude":"213213","longitude":"543543"}
]}
}
var postData = JSON.stringify(allData);
$.ajax({
type : "POST",
url : 'pdfServlet',
contentType: "application/json; charset=utf-8",
data : postData,
async : false,
success : function(data) {
alert("got some data");
console.log(data);
},
});
});
});
Und das servlet erstellen der Datei:
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
//get the json content
StringBuffer jsonContent = getPostedContent(request);
log.info(jsonContent.toString());
//convert json to pojo's
Tables tables = getTablesFromString(jsonContent);
//create a xml stream
ByteArrayOutputStream xml = new XmlConverter().getXMLSource(tables);
//put the xml on the request
request = setXmlOnRequest(request, xml);
//create pdf data of the pdf-able xml content
ByteArrayOutputStream pdf = new PdfHandler().createPdfDataStream(request);
//response = createResponseheaders(response, request);
response.setContentType("application/pdf");
response.setContentLength(pdf.size());
response.setHeader("Content-disposition", "attachment; filename=test.pdf");
response.setCharacterEncoding("utf-8");
response.getOutputStream().write(pdf.toByteArray());
//close the streams
pdf.close();
response.getOutputStream().close();
}
Die Ausgabe im log:
%PDF-1.4
%
4 0 obj
<<
/Producer (Apache FOP Version SVN branches/fop-0_95)
/CreationDate (D:20130725162007+02'00')
>>
endobj
5 0 obj
<<
/N 3
/Length 11 0 R
/Filter /FlateDecode
>>
stream
xwTSϽ7PhRHH.*1 J
*MEINE LÖSUNG: *
sehen http://www.particletree.com/notebook/ajax-file-download-or-not/ für einen Zeiger
Erstellte ich ein Formular mit einem versteckten Feld:
<button id="exportButton">export</button>
<form id="exportForm" method="post" action="pdfServlet">
<input type="hidden" value="empty" id="pdf_data" name="pdf_data" />
</form>
als ich änderte meine jquery-post-Daten controller:
$('#exportButton').click(function() {
var tableIdx = performanceDetailTableController.getTableIdx();
var allData = {
"shipTable1":{
"rows":[
{ "latitude":"12323","longitude":"213213"},
{ "latitude":"213213","longitude":"543543"}
]},
"shipTable2":{
"rows":[
{ "latitude":"12323", "longitude":"213213"},
{ "latitude":"213213","longitude":"543543"}
]}
}
var postData = JSON.stringify(allData);
//put the data on the hidden form field in the export form
$('#pdf_data').val(postData);
//and submit the form
$('#exportForm').submit();
});
so, jetzt, wenn ich auf die Schaltfläche "exportieren", das versteckte Feld in die form bekommt, die Daten zu veröffentlichen, und die Daten werden geschrieben als www-form codiert ist.
Diese Weise das servlet kann die Anforderung Bearbeiten und die Datei wird auf den client heruntergeladen.
- Sie können nicht zwingen, eine Datei herunterzuladen mit ajax.
- Ajax-Antworten sind nicht zulässig, um Dateien herunterzuladen .
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie keine Dateien herunterladen mit ajax. JavaScript hat aus offensichtlichen Gründen der Sicherheit keine Einrichtungen zum auslösen einer Speichern Als Dialog mit beliebig abgerufen/generated content im JavaScript-Kontext. Das world wide web hätte ganz anders aussah, wenn das überhaupt möglich war.
Wenn Sie darauf bestehen in der Verwendung JS/jQuery für, die, Sie benötigen, senden Sie ein synchronus GET-Anforderung statt. Sie können tun, dass mit
window.location
(Sie müssen sich nur umbenennendoPost()
zudoGet()
).Alternativ einfach wegwerfen, dass die nicht benötigten JS/jQuery und benutzen Sie einfach plain HTML
<form action="pdfServlet" method="post">
mit<input type="submit">
. Zusätzliche bonus ist, dass es funktioniert im Browser mit JS deaktiviert.Wenn Ihr einziger Grund zu schnappen ajax ist eigentlich ein naiver Versuch zu vermeiden, die Seite aktualisiert wird, dann kann ich dir sagen, dass dies wirklich nicht passieren, wenn die Antwort hat ein
Content-Disposition: attachment
header. Also das Teil ist schon sicher.Content-Disposition:attachment
Antwort) nicht dazu führen, dass eine Aktualisierung der Seite.byte[]
. Nur tunresponse.getOutputStream().write(pdf.toByteArray());
. Beachten Sie, dass es wäre mehr effektiv, wennPdfHandler
schriebresponse.getOutputStream()
sofort erstellen, anstatt eine in-memory -byte[]
. Aber das alles ist nicht das eigentliche Funktionalität zum senden einer Datei herunterladen.