seamでのファイルアップロード&ダウンロード

seamでファイルのアップロードにはs:fileUploadを使う。

これを使うと、EntityBeanに簡単にinsert出来る。

view部分

<h:form id=”setFORM” enctype=”multipart/form-data”>

<h:outputText value=”#{workfile.filename}” />

<s:fileUpload id=”uploadFile” data=”#{workfile.data}” fileName=”#{workfile.filename}” />

<h:commandButton id=”save” value=”登録” action=”#{fileEntryAction.save}” />

</h:form>

sessionBean部分

public String save() {

em.persist(workfile);

}

entityBean部分

public class Workfile implements java.io.Serializable {

@Id

@GeneratedValue

private Long workfile;

private String filename;

@Lob

@Column(length = 2147483647)

@Basic(fetch = FetchType.LAZY)

private byte[] data;

~ getter/setter 省略 ~

}

わずか数分でコーディング完了。

次にEntityBeanにbyte[]で登録したファイルのダウンロード。

s:linkでリンクをはっておき

<th><h:outputLabel value=”図面:” /></th>

<td><s:link action=”#{restoreAction.download(item.workfile)}” value=”#{item.workfile.filename}” /></td></tr>

該当action部分

public void download(Workfile workfile) {

try {

ExternalContext externalContext = facesContext.getExternalContext();

HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();

response.setContentType(“application/octet-stream”);

response.setHeader(“Content-Disposition”,”attachment; filename=¥”"+workfile.getFilename()+”¥”");

ServletOutputStream os = response.getOutputStream();

os.write(workfile.getData());

os.flush();

os.close();

facesContext.responseComplete();

} catch(Exception ex) { }

}

これでブラウザにダウンロードダイアログが表示される。

日本語ファイル名の場合は、ダウンロード時にファイル名の文字コードを変換すればよい。

コメントは受け付けていません。