SoftwareEngineering

圧縮ファイルのダウンロード

このページはすべて他者のページの引用です。 仕組みを理解したら、このページを消します。

メモ

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

引用元:http://terasolunaorg.github.io/guideline/5.1.0.RELEASE/ja/ArchitectureInDetail/RestClient.html#restclienthowtousefiledownload

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を使用して、ファイルのダウンロードを行う。

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

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

トップ   一覧 検索 最終更新   ヘルプ   最終更新のRSS