Google App Engine でのファイルアップロード

HTML フォームからファイルをアップロードするには、通常次のようなフォームを利用しますよね。

<form action="..." method="POST" enctype="multipart/form-data">
<input type="file" name="file1">
<input type="submit" value="Upload">
</form>

ポイントは FORM タグの action にアップロード先 URL を設定、enctype として multipart/form-data、そして、 ファイルの指定は INPUT タグの type 属性に file を指定します。

これは Google App Engine に限ったことではないのでご存知の方も多いと思います。

Google App Engine のファイルアップロードでも、これをベースにしています。

Google App Engine でのファイルアップロード

ファイルをアップロードして保存する先はブロブストア (blobstore) です。

アップロードされたファイルはブロブストアに保存され、ひとつひとつのアップロードファイルが、ブロブストア内のブロブとして識別されます。 ブロブを識別するキーは、ブロブキー (BlobKey) です。

アップロード先 URL の取得

ブロブストアにアップロードする、と言いましたが、具体的な URL がないと action 属性が書けません。 アップロード先 URL を取得するには、BlobstoreService の createUploadUrl() メソッドを呼びます。

これで取得された URL を action 属性に設定すればアップロードは完了します。 アップロード完了後、createUploadUrl メソッドのパラメータに指定した URL にフォワードされます。

具体例で説明します。次のコードを見てください。

<%
     String uploadUrl 
          = blobstoreService.createUploadUrl("/upload");
%>
<html>
<body>
<form 
     action="<%= uploadUrl %>" 
     method="POST" 
     enctype="multipart/form-data">

ここでは、"/upload" という文字列を createUploadUrl メソッドに渡して、アップロード先 URL (uploadUrl) を取得しています。 こうすると、ファイルをアップロードすると、まずブロブストアにファイルがブロブとして格納され、 その後に "/upload" へフォワードされます。

フォワード先の "/upload" では、ブロブキーを取り出すことができ、それを用いていろいろと次なる処理ができるわけです。

アップロードフォーム例

以上から、ファイルをアップロードするためのフォームは次のように作ることができます。

<%@page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %>
<%@page import="com.google.appengine.api.blobstore.BlobstoreService" %>
<%
     BlobstoreService blobstoreService 
          = BlobstoreServiceFactory.getBlobstoreService();
     String uploadUrl 
          = blobstoreService.createUploadUrl("/upload");
%>
<html>
<body>
<form 
     action="<%= uploadUrl %>" 
     method="POST" 
     enctype="multipart/form-data">
<input type="file" name="file1">
<input type="submit" value="Upload">
</form>
</body>
</html>

さて、作成されたブロブにはどのようにアクセスするのでしょうか。 その点については、「Google App Engine でのファイルアップロード ~ ブロブの取得」 を見てください。