ファイルのアップロードサーブレット - gae 2013/11/27

サーブレットです。google app engineのデータストアに、ファイルを保存してみます。
blob storeみたいなものがありますが、ここは、自前でがりがりと保存。使ったのは

ただデータストアにたいするキーは、フォームのtextから取得するようにしてます。
テキストフィールドの値を取得するとき、 ユーティリティのorg.apache.commons.fileupload.util.Streams
を使ってます。

下記のコードだと、1ファイル、1テキストフィールドのみの対応です。

package ugo; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.util.Streams; import com.google.appengine.api.datastore.Blob; import com.google.appengine.api.datastore.DatastoreService; import com.google.appengine.api.datastore.DatastoreServiceFactory; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.KeyFactory; public class FileUploadServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String file_id = null; DatastoreService datastore = DatastoreServiceFactory .getDatastoreService(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { ServletFileUpload upload = new ServletFileUpload(); FileItemIterator iterator = upload.getItemIterator(req); while (iterator.hasNext()) { FileItemStream item = iterator.next(); InputStream stream = item.openStream(); if (item.isFormField()) { // log.warning("Got a form field: " + item.getFieldName()); // フィールドの値を取得する // file_id = Streams.asString(stream); } else { int len; byte[] buffer = new byte[8192]; while ((len = stream.read(buffer, 0, buffer.length)) != -1) { baos.write(buffer, 0, len); } } // データストアに保存 Key k = KeyFactory.createKey("Template", file_id); Entity entity = new Entity(k); Blob blob = new Blob(baos.toByteArray()); entity.setProperty("data", blob); datastore.put(entity); } } catch (Exception ex) { throw new ServletException(ex); } } }

grailsでいろいろやろうと思ってるのですが、運用が楽そうなんですよね。google app engine.

: