2.3.6. ファイルダウンロード機能の作成

Exampleアプリケーションを元に、CSVファイルをダウンロードする機能の解説を行う。

作成する機能の説明
  1. プロジェクト一覧画面の、検索結果右横のダウンロードボタンを押下する。
../../../../../_images/project_download-list.png
  1. 現在の検索結果を出力したCSVファイルがダウンロードされる。
../../../../../_images/project_download-download.png

2.3.6.1. CSVファイルのダウンロードを行う

CSVファイルをダウンロードする機能の実装方法を解説する。

プロジェクト検索機能の作成方法については、 検索機能の作成 を参照すること。

ダウンロードボタンの作成

ファイルダウンロードメソッドへのGETリクエストを送信するリンクを配置する。

/src/main/webapp/WEB-INF/view/project/index.jsp
<!-- ダウンロードボタン周辺のみ記載 -->
<div style="float:left;">
    <span class="font-group">
    検索結果
    </span>
    <span class="search-result-count">
        <c:if test="${not empty searchResult}">
            <n:write name="searchResult.pagination.resultCount" />
        </c:if>
        <c:if test="${empty searchResult}">
            0
        </c:if>
    </span>
    <!-- 現在の検索条件をパラメータとして設定 -->
    <c:url value="/action/project/download" var="download_uri">
        <c:param name="searchForm.clientId" value="${searchForm.clientId}"/>
        <c:param name="searchForm.clientName" value="${searchForm.clientName}"/>
        <c:param name="searchForm.projectName" value="${searchForm.projectName}"/>
        <c:param name="searchForm.projectType" value="${searchForm.projectType}"/>
        <c:forEach items="${searchForm.projectClass}" var="projectClass">
            <c:param name="searchForm.projectClass" value="${projectClass}" />
        </c:forEach>
        <c:param name="searchForm.projectStartDateBegin" value="${searchForm.projectStartDateBegin}"/>
        <c:param name="searchForm.projectStartDateEnd" value="${searchForm.projectStartDateEnd}"/>
        <c:param name="searchForm.projectEndDateBegin" value="${searchForm.projectEndDateBegin}"/>
        <c:param name="searchForm.projectEndDateEnd" value="${searchForm.projectEndDateEnd}"/>
        <c:param name="searchForm.sortKey" value="${searchForm.sortKey}"/>
        <c:param name="searchForm.sortDir" value="${searchForm.sortDir}"/>
        <c:param name="searchForm.pageNumber" value="${searchForm.pageNumber}"/>
    </c:url>
    <n:a href="${download_uri}">
    <n:a href="download">
        <n:write name="label" />
        <n:img src="/images/download.png" alt="ダウンロード" />
    </n:a>
</div>
ファイルをバインドするBeanの作成

ファイルの内容をバインドするBeanを作成する。

ProjectDownloadDto.java
@Csv(headers = { /** ヘッダーを記述 **/},
        properties = { /** バインド対象のプロパティ **/},
        type = Csv.CsvType.CUSTOM)
@CsvFormat(charset = "Shift_JIS", fieldSeparator = ',',ignoreEmptyLine = true,
        lineSeparator = "\r\n", quote = '"',
        quoteMode = CsvDataBindConfig.QuoteMode.NORMAL, requiredHeader = true)
public class ProjectDownloadDto implements Serializable {

    // 一部項目のみ抜粋。ゲッタ及びセッタは省略

    /** プロジェクト名 */
    private String projectName;

    /** プロジェクト種別 */
    private String projectType;
}
この実装のポイント
業務アクションメソッドの作成

検索結果をCSVファイルに書きこむ業務アクションメソッドを作成する。

ProjectAction.java
@InjectForm(form = ProjectSearchForm.class, prefix = "searchForm", name = "searchForm")
@OnError(type = ApplicationException.class, path = "/WEB-INF/view/project/index.jsp")
public HttpResponse download(HttpRequest request, ExecutionContext context) {

    ProjectSearchForm searchForm = context.getRequestScopedVar("searchForm");
    ProjectSearchDto searchCondition = BeanUtil.createAndCopy(ProjectSearchDto.class, searchForm);
    LoginUserPrincipal userContext = SessionUtil.get(context, "userContext");
    searchCondition.setUserId(userContext.getUserId());

    final Path path = TempFileUtil.createTempFile();
    try (DeferredEntityList<ProjectDownloadDto> searchList = (DeferredEntityList<ProjectDownloadDto>) UniversalDao
            .defer()
            .findAllBySqlFile(ProjectDownloadDto.class, "SEARCH_PROJECT", searchCondition);
         ObjectMapper<ProjectDownloadDto> mapper = ObjectMapperFactory.create(ProjectDownloadDto.class,
                 TempFileUtil.newOutputStream(path))) {

        for (ProjectDownloadDto dto : searchList) {
            mapper.write(dto);
        }
    }

    FileResponse response = new FileResponse(path.toFile(), true);
    response.setContentType("text/csv; charset=Shift_JIS");
    response.setContentDisposition("プロジェクト一覧.csv");

    return response;
}
この実装のポイント

ファイルダウンロード機能の解説は以上。

Getting Started TOPページへ