SAStrutsを勉強してみる (8) - ファイルアップロード -
タイトル通り。SAStruts公式のドキュメントにもちゃんと解説が載ってるのでそれ見た方が早いかも。但し、今回は要件としてアップロードされた画像ファイルをコンテキスト内ではなくデータベース領域内にBlobデータとして格納する
Upload.java
package sample.entity;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
@Entity
@Table(name = "upload")
public class Upload {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public int id;
@Column(name = "filename", nullable = false)
public String fileName;
@Column(name = "data", nullable = false)
@Lob
@Basic(fetch = FetchType.LAZY)
public byte[] data;
}
@Lobでラージオブジェクトとして扱う方式でデータをセット出来る。指定出来る型はStringかbyte[]かjava.io.Serializableであれば良い模様。又、FetchType.LAZYで通常取得では取ってこないようにする(eager指定が必要)
っていう感じで同等なテーブルを作っておく。dataカラムはmediumblob辺りで
WEB-INF/jsp/uploader/index.jsp
<html>
<body>
<s:form enctype="multipart/form-data">
<input type="file" name="uploadFiles[0]" />
<input type="submit" name="upload" value="upload" />
</s:form>
<c:forEach var="item" items="${files}">
<html:img src="show/${item.id}" width="300" height="300" />
</c:forEach>
<html:errors />
</body>
</html>
IndexAction.java
package sample.action.uploader;
import java.io.IOException;
import java.util.List;
import javax.annotation.Resource;
import org.apache.struts.upload.FormFile;
import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.framework.container.annotation.tiger.Binding;
import org.seasar.framework.container.annotation.tiger.BindingType;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.annotation.IntegerType;
import org.seasar.struts.annotation.Required;
import org.seasar.struts.enums.SaveType;
import org.seasar.struts.util.ResponseUtil;
import sample.entity.Upload;
public class IndexAction {
@Required
@Binding(bindingType = BindingType.NONE)
public FormFile[] uploadFiles;
@Required(target = "show")
@IntegerType
public int id;
@Resource
private JdbcManager jdbcManager;
public List<Upload> files;
@Execute(validator = false)
public String index() {
// dataカラムは取ってこないようにeagerは指定しない
files = jdbcManager.from(Upload.class).getResultList();
return "index.jsp";
}
@Execute(input = "?redirect=true", saveErrors = SaveType.SESSION, redirect = true)
public String upload() {
for (FormFile uploadFile : uploadFiles) {
if (!uploadFile.getContentType().startsWith("image/")) {
continue;
}
try {
Upload upload = new Upload();
upload.fileName = uploadFile.getFileName();
upload.data = uploadFile.getFileData();
jdbcManager.insert(upload).execute();
} catch (IOException e) {
e.printStackTrace();
}
}
return "";
}
@Execute(validator = false, urlPattern = "show/{id}")
public String show() {
// eager指定でdataカラムを取ってくる
Upload upload = jdbcManager.
from(Upload.class).
where("id = ?", id).
eager("data").
getSingleResult();
if (upload != null) {
ResponseUtil.download(upload.fileName, upload.data);
}
return null;
}
}