GAEでファイルを使う
Google App Engine(GAE)でファイルを扱う場合、
ブロブストアというのが便利です。
GAEではデータベースの代わりにデータストアというものを使いますが、
このデータストアで扱えないような大きめのデータを扱いたい時にブロブストアというのが使えます。
やり方は簡単で、
ファイルを送付するフォームと、中継するサーブレットを用意するだけです。
1.ブロブストアサービスのインスタンス生成
BlobstoreService blobstoreService
= BlobstoreServiceFactory.getBlobstoreService();
2.(1.)のインスタンスからアップロード用URL生成
String uploadUrl = blobstoreService.createUploadUrl("/test/upload");
3.フォームの宛先に(2.)を設定
<form action="${uploadUrl}" method="post" enctype="multipart/form-data">
<input type="file" name="testFile"/>
<input type="submit" value="submit"/>
</form>
4.アップロード先からリダイレクト(Slim3での例)
return redirect("/test/getfile");
(1.)~(3.)はJSP、(4.)はフォームの宛先(/test/upload)のServletで実装します。
(1.)~(2.)で生成されるURLは固定のようですが、
生成されたURLをHTML形式でactionに指定して送信しようとすると、次のエラーが出ます。
No upload session: aglub19…
アップロード時にセッションが何か関係している模様。。。
GAEでSlim3を使った入力チェックをする時。
そんな時は、Validatorが良い仕事します。
Slim3でバリデーションによるチェックを行うときは、
org.slim3.controller.validator.Validators
を使います。
Validatorのインスタンス生成時の引数には、requestを入れるので、
処理を行うのはControllerが主になるのではないかと思います。
//引数にリクエストを入れる。
Validators v = new Validators(request);
インスタンスを生成したら、入力チェック条件を設定します。
引数に設定したrequestのパラメータを対象に入力チェック条件を指定しますが、
この時、第一引数にはチェック対象のパラメータ名を指定します。
//必須、最小、最大、半角英数字のチェック
v.add("id", v.required(), v.minlength(4), v.maxlength(30), v.regexp("^[\\w]+$"));
//二つ同時にやるときは同じように記述
v.add("pass", v.required(), v.minlength(6), v.maxlength(30), v.regexp("^[\\w]+$"));
ここで「"id"」と「"pass"」はリクエストパラメータ名。
チェック対象にした後は、チェック処理を実行します。
if (v.validate()) {
//OKな場合
} else {
System.out.println(v.getErrors().get("id"));
System.out.println(v.getErrors().get("pass"));
}
今回は実際に使用するわけではないのでコンソール出力です。
必要に応じて変更して下さい。
エラーメッセージとして出力されるメッセージは
以下のファイルで設定されています。
src/application_ja.properties
src/application_en.properties
この場合、
必須チェックでエラーだと、
src/application_ja.propertiesの内容がデフォルトで
validator.required={0}は必須です。
となっているので、
出力内容は
「は必須です。」
となります。
この時、パラメータ名と{0}に埋め込む値のペアを設定しておくことで、
自動的に文字列が埋め込まれます。
ペアの設定方法は
src/application_ja.propertiesに
label.id=ID
を追加することで出来ます。
(この場合idはパラメータ名、IDが埋め込む値です)
設定後、もう一度空値でsubmitすると、
「IDは必須です。」
となります。
そんな時は、Validatorが良い仕事します。
Slim3でバリデーションによるチェックを行うときは、
org.slim3.controller.validator.Validators
を使います。
Validatorのインスタンス生成時の引数には、requestを入れるので、
処理を行うのはControllerが主になるのではないかと思います。
//引数にリクエストを入れる。
Validators v = new Validators(request);
インスタンスを生成したら、入力チェック条件を設定します。
引数に設定したrequestのパラメータを対象に入力チェック条件を指定しますが、
この時、第一引数にはチェック対象のパラメータ名を指定します。
//必須、最小、最大、半角英数字のチェック
v.add("id", v.required(), v.minlength(4), v.maxlength(30), v.regexp("^[\\w]+$"));
//二つ同時にやるときは同じように記述
v.add("pass", v.required(), v.minlength(6), v.maxlength(30), v.regexp("^[\\w]+$"));
ここで「"id"」と「"pass"」はリクエストパラメータ名。
チェック対象にした後は、チェック処理を実行します。
if (v.validate()) {
//OKな場合
} else {
System.out.println(v.getErrors().get("id"));
System.out.println(v.getErrors().get("pass"));
}
今回は実際に使用するわけではないのでコンソール出力です。
必要に応じて変更して下さい。
エラーメッセージとして出力されるメッセージは
以下のファイルで設定されています。
src/application_ja.properties
src/application_en.properties
この場合、
必須チェックでエラーだと、
src/application_ja.propertiesの内容がデフォルトで
validator.required={0}は必須です。
となっているので、
出力内容は
「は必須です。」
となります。
この時、パラメータ名と{0}に埋め込む値のペアを設定しておくことで、
自動的に文字列が埋め込まれます。
ペアの設定方法は
src/application_ja.propertiesに
label.id=ID
を追加することで出来ます。
(この場合idはパラメータ名、IDが埋め込む値です)
設定後、もう一度空値でsubmitすると、
「IDは必須です。」
となります。
Google App Engine for JavaでSSL通信するとき
・appengine-web.xmlファイルに「ssl-enabled」を有効にする
<ssl-enabled>true</ssl-enabled>
・web.xmlファイルに「security-constraint」を記述する、
<security-constraint>
<web-resource-collection>
<url-pattern>/hoge/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
※「url-pattern」はSSL通信を行う対象により任意で設定して下さい。
Google App EngineのSSL通信は、ローカルの開発環境では動作しないため、
実際にテストや稼働を行う場合は、本番環境にデプロイする必要があります。
開発環境でアプリケーションの実行を行うと
YYYY/MM/DD h:mm:ss com.google.apphosting.utils.jetty.DevAppEngineWebAppContext disableTransportGuarantee
情報: Ignoring <transport-guarantee> for /hoge/* as the GK does not support HTTPS. It will still be used when you upload your application.
といったログがコンソールに出力されます。
この場合エラーではなく、HTTP通信で実行する形となります。
・appengine-web.xmlファイルに「ssl-enabled」を有効にする
<ssl-enabled>true</ssl-enabled>
・web.xmlファイルに「security-constraint」を記述する、
<security-constraint>
<web-resource-collection>
<url-pattern>/hoge/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
※「url-pattern」はSSL通信を行う対象により任意で設定して下さい。
Google App EngineのSSL通信は、ローカルの開発環境では動作しないため、
実際にテストや稼働を行う場合は、本番環境にデプロイする必要があります。
開発環境でアプリケーションの実行を行うと
YYYY/MM/DD h:mm:ss com.google.apphosting.utils.jetty.DevAppEngineWebAppContext disableTransportGuarantee
情報: Ignoring <transport-guarantee> for /hoge/* as the GK does not support HTTPS. It will still be used when you upload your application.
といったログがコンソールに出力されます。
この場合エラーではなく、HTTP通信で実行する形となります。