Ich möchte ohne Bildschirmübergang herunterladen, aber ich wollte die HttpResponseHeader-Klasse nur ungern verwenden, daher habe ich sie nur mit der Spring-Paketklasse implementiert. Beachten Sie, dass die Implementierung auf der Clientseite wahrscheinlich vergessen wird.
Controller
@RequestMapping("/download")
@ResponseBody
public ResponseEntity<byte[]> download() {
byte[] data = xxx; // xxx:byte[]Objekt formatieren
// ResponseHeader
HttpHeaders header = new HttpHeaders();
header.add("Content-Type", "yyy"); // yyy:Beliebiger Inhalt-Type
header.add("Content-Disposition", "attachment; filename*=utf-8''" + URLEncoder.encode("zzz", "UTF-8")); // zzz:Beliebiger Dateiname
header.add("Set-Cookie", "fileDownload=true; path=/");
return new ResponseEntity<byte[]>(data, header, HttpStatus.OK);
}
javascript
//Ereignis beim Senden des Formulars hinzufügen
$("#myform").submit(function() {
startLoading(); //Runde und runde Methode
const COOKIE_KEY_FILEDOWNLOAD = 'fileDownload=';
var isFileDownload = false;
//Wiederholen, bis der Download abgeschlossen ist
var intervalId = setInterval(function() {
//Holen Sie sich fileDownload von Cookie
const COOKIES = document.cookie;
var position = COOKIES.indexOf(COOKIE_KEY_FILEDOWNLOAD);
if (position >= 0) {
var startIdx = position + COOKIE_KEY_FILEDOWNLOAD.length;
var endIdx = COOKIES.indexOf(';', startIdx);
if (endIdx < 0) {
endIdx = COOKIES.length;
}
isFileDownload = decodeURIComponent(COOKIES.substring(startIdx, endIdx)) == 'true';
}
//Wenn fileDownload true ist, wird es wiederholt beendet
if (isFileDownload) {
clearInterval(intervalId);
var date = new Date();
date.setTime(date.getTime() - 1);
document.cookie = COOKIE_KEY_FILEDOWNLOAD + 'false; path=/; max-age=0';
stopLoading(); //Eine Methode, um rund und rund anzuhalten
}
}, 500);
});
Recommended Posts