ファイルのアップロードサーブレット - gae
2013/11/27
サーブレットです。google app engineのデータストアに、ファイルを保存してみます。
blob storeみたいなものがありますが、ここは、自前でがりがりと保存。使ったのは
テキストフィールドの値を取得するとき、 ユーティリティの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.
: