スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Spring MVC ファイルダウンロードを実装する

今回はファイルダウンロードを実装したいと思う。

ちなみにファイルアップロードの実装については過去の記事で掲載している。

■ファイルアップロードに関する過去の記事
Spring MVC ファイルアップロードを実装する[入力チェック編]

◎動作検証にあたっての各バージョンは以下の通り
  • SpringFramework 3.2.8.RELEASE
  • Java 1.7
  • Tomcat 7.0

1.BookController.java(関連箇所のみ掲載)

package jp.co.sample.book.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletResponse;
import jp.co.sample.exception.BookException;
import org.apache.commons.io.IOUtils;
//他のimport文省略

@Controller
@RequestMapping("/book")
@SessionAttributes("bookSearchForm")
public class BookController {

//変数定義省略

@RequestMapping(value = "/list/download", method = RequestMethod.GET)
public void downloadFile(HttpServletResponse response) {
logger.info("download start");
//ダウンロードファイルの取得
String fileName = "test.xlsx";
File file = new File("download\\" + fileName);
String savePath = file.getAbsolutePath();

InputStream is = null;
byte[] fileContent = null;
try {
is = new FileInputStream(savePath);
fileContent = IOUtils.toByteArray(is);
} catch (FileNotFoundException e) {
throw new BookException(fileName + " not found");
} catch (IOException e) {
throw new BookException(e);
} finally {
IOUtils.closeQuietly(is);
}

//ファイルの書き込み
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
response.setContentLength(fileContent.length);

OutputStream os = null;
try {
os = response.getOutputStream();
os.write(fileContent);
os.flush();
} catch (IOException e) {
throw new BookException(e);
} finally {
IOUtils.closeQuietly(os);
}
}
//他のメソッド省略
}

22行目のdownloadFileメソッドがファイルダウンロード処理となる。引数には、ファイルへの書き込みに必要なHttpServletResponseを設定しており、responseオブジェクトは自動でバインドされる。

25行目のダウンロードファイル名であるが、「test.xlsx」の通りExcelファイルを対象としている。今回はダウンロードすることが目的のため、A1セルに「ダウンロードサンプル」と入力されただけのファイルであるが、Apache POIを使って一覧情報をExcelファイルに保存することなどを想定している。

26行目のFileオブジェクトのコンストラクタには、相対パスで「download」フォルダ配下に「test.xlsx」ファイルが格納されていることを想定している。絶対パスにした場合、移植性が低下するため、相対パスを使っている。そして、27行目のgetAbsolutePathメソッドで、フルパスを取得するようにしている。

33行目がバイト配列に変換している処理となる。

35行目は「test.xlsx」ファイルが見つからなかったときの例外ハンドリングとなるが、例外メッセージにフルパスが表示されることを回避するため、「fileName + " not found"」として、メッセージにはファイル名のみ表示するようにしている。なお、自作のBookExceptionについては、前回の例外ハンドリングに関する記事を参考にしてほしい。

39、55行目については、IOUtilsクラスを使って、InputStreamをクローズしている。

43行目以降がファイルへの書き込み処理となる。

43~45行目はresponseオブジェクトにファイルダウンロード用の設定をしている。

50行目でOutputStreamに変換したバイト配列を書き込むように命令し、51行目のflushメソッドでバッファに入っている出力バイトをすべて強制的に書き込んでいる。

■例外ハンドリングに関する過去の記事
Spring MVC 例外ハンドリング


2.pageList.jsp(関連箇所のみ掲載)

<body>
<spring:url value="/book/list/download" var="varBookDownloadUrl"/>
<spring:message code="link.download" var="varLinkDownload"/>
<!-- 省略 -->

<div class="row">
<div class="col-sm-6"></div>
<div class="col-sm-6 text-right">
<!-- 1.ROLE_ADMIN と ROLE_USERの両方必要 → testadminのみ表示 -->
<sec:authorize ifAllGranted="ROLE_ADMIN,ROLE_USER">
<a href="${varBookAddUrl}">${varLinkAdd}</a> |
</sec:authorize>
<a href="${varBookDownloadUrl}">${varLinkDownload}</a>
</div>
</div>
<!-- 省略 -->
</body>

ダウンロード用のリンクを用意。なお、本機能は管理者、一般ユーザーのどちらでも使用可能としている。

3.動作確認
①日本語の場合
download_1.png

②英語の場合
download_2.png

③ダウンロードの実行(その1)
download_3.png

ファイルダウンロードのダイアログが表示される。

④ダウンロードの実行(その2)
download_4.png

ファイルダウンロード完了のダイアログが表示される。

⑤ダウンロードファイルが存在しない場合
download_5.png

変換した例外メッセージが表示される。


今回の実装で、ファイルアップロード/ダウンロードの両方ができるようになった。


■過去のSpring関連記事
Spring関連記事 Index

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

bookmount8

Author:bookmount8
システムエンジニア。サーバーサイドでjavaを扱うことが多い。最近は、ミドルやフロント周りも関心あり。

最新記事
カテゴリ
検索フォーム
最新コメント
月別アーカイブ
これまでの訪問者数
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。