使用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/

广告
将在 10 秒后关闭
bannerAds