使用Spring Boot进行下载
环境 –
-
- Spring Boot v1.3.0
-
- java 8
- jquery
目的
我想下载而不进行画面跳转,但因为不太愿意使用HttpResponseHeader类,所以只使用Spring包中的类来实现。为了备忘起见,也可能会忘记客户端的实现。
实施
控制器
@RequestMapping("/download")
@ResponseBody
public ResponseEntity<byte[]> download() {
byte[] data = xxx; // xxx:byte[]形式のオブジェクト
// ResponseHeader
HttpHeaders header = new HttpHeaders();
header.add("Content-Type", "yyy"); // yyy:任意のContent-Type
header.add("Content-Disposition", "attachment; filename*=utf-8''" + URLEncoder.encode("zzz", "UTF-8")); // zzz:任意のファイル名
header.add("Set-Cookie", "fileDownload=true; path=/");
return new ResponseEntity<byte[]>(data, header, HttpStatus.OK);
}
-
- Content-Dispositionで強制的にダウンロード、かつ日本語ファイル名に対応。
- Set-Cookieしてるのはこの後クライアント側で使うため。
JavaScript (只需要一种选项)的释义:
// formのサブミット時にイベント追加
$("#myform").submit(function() {
startLoading(); // ぐるぐる出す的メソッド
const COOKIE_KEY_FILEDOWNLOAD = 'fileDownload=';
var isFileDownload = false;
// ダウンロード完了まで繰り返す
var intervalId = setInterval(function() {
// cookieから fileDownload の取得
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';
}
// fileDownloadがtrueなら繰り返し終了
if (isFileDownload) {
clearInterval(intervalId);
var date = new Date();
date.setTime(date.getTime() - 1);
document.cookie = COOKIE_KEY_FILEDOWNLOAD + 'false; path=/; max-age=0';
stopLoading(); // ぐるぐるやめる的メソッド
}
}, 500);
});
- Set-Cookieされた値を参照することでダウンロード成功時にぐるぐるを止めるようにしている。
请参考
-
- 日本語ファイル名ダウンロード https://www.greptips.com/posts/869/
ResponseEntityの使い方 https://qiita.com/YAKINIKU/items/abaa54ba531a30850d10
ファイルダウンロード完了後に画面遷移などをjavascriptで行う http://nabehiro.hatenablog.com/entry/20140208/1391850498
javascriptでcookie https://so-zou.jp/web-app/tech/programming/javascript/cookie/