SAStrutsを勉強してみる (8) - ファイルアップロード -

2012-10-09T00:00:00+00:00 Java SAStruts

タイトル通り。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;
    }
}

ConnectivityManager.isActiveNetworkMeteredな件