download-Datei mit ajax() POST-Anforderung durch Spring MVC
Ich versuche, eine Datei zu downloaden. Die Aktion wird ausgelöst, indem Sie ajax () - Post-Request. Die Anfrage sendet Daten im json-format an den controller. Die controller generieren der Datei (in bytes) und senden Sie es zurück.
java-script:
function getLicenseFile() {
$.ajax({
type: 'POST',
url: '<%=request.getContextPath()%>/licenses/rest/downloadLicenseFile',
dataType: 'json',
contentType: 'application/json;charset=UTF-8',
data: ko.mapping.toJSON(licenseModel),
success: function (data) {
console.log("in sucess")
},
error:function (xhr, ajaxOptions, thrownError){
console.log("in error")
}
});
}
Controller:
@RequestMapping(value = "/licenses/rest/downloadLicenseFile", method = RequestMethod.POST)
@ResponseStatus(value=HttpStatus.OK)
@ResponseBody
public void createLicenseFile(@Valid @RequestBody License license, HttpServletResponse response) throws Exception {
logger.debug("Contoller License in: "+ license);
byte[] licensedata = licenseEncodeDefaultService.createLicenseFile(license);
logger.debug("licenseData: " + new String(licensedata));
response.setHeader("Content-Disposition", "attachment; filename=\"" + license.getCustomer() + ".license\"");
response.getOutputStream().write(licensedata);
response.flushBuffer();
}
Problem:
* Soll der Browser öffnet ein download-box, aber es nicht geschah
* Die Antwort verarbeitet wird, in der Fehler: der Abschnitt der ajax-Funktion (aber der http-Status OK)
Also, was mache ich falsch oder was ist der richtige Weg, dies zu tun?
- Du bist Einstellung
dataType: 'json'
aber Sie irgendeine Art von Lizenz-Datei? Auch ich glaube nicht, können Sie ajax verwenden, um eine Datei herunterzuladen. - versuchen, das herunterladen einer Datei gespeichert werden, um lokale Verzeichnis mit ajax kann nicht getan werden, und ist viel mehr code als nur die Umleitung auf die Datei-url selbst
- stackoverflow.com/questions/3613526/... könnte auch helfen
- eine funktionierende Lösung Gefunden: Was ist die richtige Art und Weise zu kommunizieren. Soll ich Antwort auf meine eigene Frage ???
- Natürlich hast du Recht. Ich vermisse, dass der Datentyp für den Rückgabewert.
- Es ist ok, um Ihre eigene Frage zu beantworten.
- Könnten Sie bitte teilen Sie die Funktionierende Lösung, die Sie gefunden? Ich habe genau das gleiche Problem...
- Sorry für die Verspätung. Finden Sie jetzt mir die Lösung in den Antworten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Senden Sie einfach eine URL der Datei in der Antwort, und dann "besuchen" Sie in Ihrem
success
Rückruf.data.fileUrl
sollte festgelegt werden, in der Antwort vom server zum client sagen wo man die Datei.So wird Ihr server eine Antwort senden mit JSON, wie
@will824 Als Sie Fragen, ich werde mir die Lösung.
Verwendete ich einen workaround im controller und speichern Sie die Datei vorübergehend in das filesystem (/tmp). Nach dem aufteilen der Funktion in 2 Schritten. Erstellen und downloaden.
Dies ist nicht sehr schön, aber gut genug für mich.
Controller (erstellen Sie die Datei, gespeichert auf server-Dateisystem):
Controller (download-Datei):
javascript:
Wenn Sie möchten, laden Sie die Datei ohne änderung der url, die Sie aufrufen können, bilden.submit() programmgesteuert statt mithilfe von ajax.
Javascript:
Controller:
Als die Kommentare, die sagte, Sie kann es nicht mit einem ajax-Aufruf, aber Sie können es mit einfachen Javascript.
Beachten Sie die Verwendung von
${pageContext.request.contextPath}
, die sich bevorzugt über<%=request.getContextPath()%>
.Ajax ist nicht zu helfen, Sie versuchen mit versteckten form Ansatz
übergeben Sie json über Formularfeld
klicken Sie auf der download-Schaltfläche zum senden des Formulars
$('#formid').submit();
dann im server-Seite
schreiben auf den Ausgabe-stream dann in der Nähe oder bündig
wenn Sie das senden von großen Datenmengen per post update postsize in server.xml