どんなファイルでも必ずダウンロードダイアログを表示させることができたのでメモメモ。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}」など。
これでブラウザのダウンロードダイアログが必ず出るようになったので、プレーンテキストだろうとバイナリファイルだろうと、そのまま開くかダウンロードするかをユーザーに選択してもらえるようになった。
一応できたことはできたんだけど、イマイチまだ理解に乏しいのが難点。
コメント