[Java] ICEfacesでファイルの強制ダウンロード

どんなファイルでも必ずダウンロードダイアログを表示させることができたのでメモメモ。Firefox3.5でしか動作確認はしていないけど。

まずダウンロード処理用にクラスをひとつ作る。

class OutputStream implements Resource {
    private String resourceName = null;
    private Date lastModified = null;
    private InputStream inputStream = null;

    public OutputStream(
            final ExternalContext argExcon,
            final String argResourceName) {
        this.resourceName = argResourceName;
        this.inputStream = argExcon.getResourceAsStream(argResourceName);
        this.lastModified = new Date();
    }

    @Override
    public InputStream open() throws IOException {
        return this.inputStream;
    }

    @Override
    public String calculateDigest() {
        return this.resourceName;
    }

    @Override
    public Date lastModified() {
        return this.lastModified;
    }

    @Override
    public void withOptions(final Options arg) throws IOException {
    }
}

次に、マネージドBeanに処理を追加。

private Resource csvResource = null;

public final void csvOutputAction() {
    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext excon = context.getExternalContext();

    csvResourceForEvent =
            new OutputStream(excon, "/page/report/sample.csv");
}

public final Resource getCsvResource() {
    return this.csvResource;
}

"/page/report/sample.csv" としているところは、コンテキストルートを基準として、ダウンロードするファイルの場所を指定。動的に作成したファイルでもOK。

最後に、JSPにボタンを配置。

<ice:outputResource
     fileName="sample.csv"
     resource="#{page$report$OutputCsv.csvResource}"
     type="button"
     label="ダウンロード"/>

動的に作成したファイルの場合は、fileNameも動的に変える必要あり。
例えば「#{page$report$OutputCsv.downloadFName}」など。

これでブラウザのダウンロードダイアログが必ず出るようになったので、プレーンテキストだろうとバイナリファイルだろうと、そのまま開くかダウンロードするかをユーザーに選択してもらえるようになった。

一応できたことはできたんだけど、イマイチまだ理解に乏しいのが難点。

コメント

タイトルとURLをコピーしました