[[SoftwareEngineering]]

*圧縮ファイルのダウンロード [#q2c12ce1]
このページはすべて他者のページの引用です。
仕組みを理解したら、このページを消します。

**メモ [#mb263272]
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

** [#aef4740f]
[[引用元:http://terasolunaorg.github.io/guideline/5.1.0.RELEASE/ja/ArchitectureInDetail/RestClient.html#restclienthowtousefiledownload>http://terasolunaorg.github.io/guideline/5.1.0.RELEASE/ja/ArchitectureInDetail/RestClient.html#restclienthowtousefiledownload]]

RestTeamplateを使用してファイルダウンロードを行う場合は、以下のように実装する。

***ファイルダウンロードの実装例(ファイルサイズが小さい場合) [#zcd1708f]
 RequestEntity requestEntity = RequestEntity
         .get(uri)
         .build();
 
 ResponseEntity<byte[]> responseEntity =
         restTemplate.exchange(requestEntity, byte[].class);//(1)
 
 byte[] downloadContent = responseEntity.getBody();//(2)

|項番|説明|h
|(1)|ダウンロードファイルを指定したデータ型で扱う。ここでは、バイト配列を指定。|
|(2)|レスポンスボディからダウンロードしたファイルのデータを取得する。|

***ファイルダウンロードの実装例(ファイルサイズが大きい場合) [#z52f8b7c]
 // (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();
 
     .....
 
 }

|項番|説明|h
|(1)|RestTemplate#executeで取得されたレスポンスから、RestTemplate#executeの戻り値を作成するための処理を作成する。|
|(2)|レスポンスボディ(InputStream)からデータを読込み、ファイルを作成する。&br;作成したファイルとHTTPヘッダ、ステータスコードを ResponseEntity<File>に格納して返却する。|
|(3)|RestTemplate#executeを使用して、ファイルのダウンロードを行う。|

***ファイルダウンロードの実装例(ファイルサイズが大きい場合(ResponseEntityを使わない例)) [#j934050d]

ステータスコードの判定や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);
 .....
 

** [#d1049e30]
[[引用元:http://kawamura-mark2.hatenablog.jp/entry/2015/11/11/125208>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();
     }
 }


トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS