このページはすべて他者のページの引用です。 仕組みを理解したら、このページを消します。
jQuery でバイナリーファイルをダウンロードするとファイルが破損するっぽい https://stackoverflow.com/questions/46955426/unable-to-downloading-zip-file-from-ajax-byte-reponseconverting-it-to-blob-in https://stackoverflow.com/questions/34756633/trouble-downloading-binary-file-with-angular-http-or-jquery-ajax https://code.i-harness.com/ja/q/f57492 https://qiita.com/yuma84/items/fefb95c1a10396070cd2
RestTeamplateを使用してファイルダウンロードを行う場合は、以下のように実装する。
RequestEntity requestEntity = RequestEntity .get(uri) .build(); ResponseEntity<byte[]> responseEntity = restTemplate.exchange(requestEntity, byte[].class);//(1) byte[] downloadContent = responseEntity.getBody();//(2)
項番 | 説明 |
(1) | ダウンロードファイルを指定したデータ型で扱う。ここでは、バイト配列を指定。 |
(2) | レスポンスボディからダウンロードしたファイルのデータを取得する。 |
// (1) final ResponseExtractor<ResponseEntity<File>> responseExtractor = new ResponseExtractor<ResponseEntity<File>>() { // (2) @Override public ResponseEntity<File> extractData(ClientHttpResponse response) throws IOException { File rcvFile = File.createTempFile("rcvFile", "zip"); FileCopyUtils.copy(response.getBody(), new FileOutputStream(rcvFile)); return ResponseEntity.status(response.getStatusCode()) .headers(response.getHeaders()).body(rcvFile); } }; // (3) ResponseEntity<File> responseEntity = this.restTemplate.execute(targetUri, HttpMethod.GET, null, responseExtractor); if (HttpStatus.OK.equals(responseEntity.getStatusCode())) { File getFile = responseEntity.getBody(); ..... }
項番 | 説明 |
(1) | RestTemplate#executeで取得されたレスポンスから、RestTemplate#executeの戻り値を作成するための処理を作成する。 |
(2) | レスポンスボディ(InputStream)からデータを読込み、ファイルを作成する。 作成したファイルとHTTPヘッダ、ステータスコードを ResponseEntity<File>に格納して返却する。 |
(3) | RestTemplate#executeを使用して、ファイルのダウンロードを行う。 |
ステータスコードの判定やHTTPヘッダの参照等が不要な場合は、 以下のようにResponseEntityではなく Fileを返却すればよい。
final ResponseExtractor<File> responseExtractor = new ResponseExtractor<File>() { @Override public File extractData(ClientHttpResponse response) throws IOException { File rcvFile = File.createTempFile("rcvFile", "zip"); FileCopyUtils.copy(response.getBody(), new FileOutputStream( rcvFile)); return rcvFile; } }; File getFile = this.restTemplate.execute(targetUri, HttpMethod.GET, null, responseExtractor); .....
引用元:http://kawamura-mark2.hatenablog.jp/entry/2015/11/11/125208
バイナリデータのリスト dataList = getDataList(); // 日本語ファイル名対応 String encodFile = URLEncoder.encode(this.fileName, "UTF-8"); // ヘッダー情報設定 response.setHeader("Content-Transfer-Encoding", "binary"); response.setHeader("Content-Type", "application/zip;charset=UTF-8"); response.setHeader("Content-disposition", "attachment; filename=\"" + encodFile + "\"; filename*=utf-8'ja'" + encodFile); // ZIPファイルを書込む為の出力ストリームを、HTTPコンテンツ本体へのバイナリ出力として初期化する。 ZipOutputStream zipOutStream = new ZipOutputStream(response.getOutputStream()); zipOutStream.setEncoding("MS932"); // ファイル出力 try { // zip作成 for (バイナリデータ imageRecord : バイナリデータのリスト) { // 取得イメージを、ZIP書込み ByteArrayOutputStream objBos; objBos = new ByteArrayOutputStream(imageRecord.getImegeInfo().length); objBos.write(imageRecord.getImegeInfo(), 0, imageRecord.getImegeInfo().length); objBos.close(); // ZipOutputStreamにZipEntryを設定 ZipEntry objZe = new ZipEntry(fileName); objZe.setMethod(ZipOutputStream.DEFLATED); zipOutStream.putNextEntry(objZe); // 取込イメージ情報を書込み byte[] aryByt = objBos.toByteArray(); zipOutStream.write(aryByt, 0, aryByt.length); // ZipEntryのクローズ zipOutStream.closeEntry(); } zipOutStream.close(); } catch (Exception e) { // エラー処理 } finally { if (zipOutStream != null) { zipOutStream.close(); } }