Google Cloud Storageを利用する (4/5)
作成:2012-06-10 11:17
更新:2012-06-10 11:28
更新:2012-06-10 11:28
■テキストファイルの読み書きを行う
では、テキストファイルアクセスの基本が一通りわかったところで、実際の利用例を挙げておきましょう。
下に、helo.jspとMyGaeAppServlet.javaのソースコードを掲載しておきました。これは、JSPベースで作られた投稿&内容表示ページと、そこから呼び出されるサーブレットで構成されています。helo.jspにアクセスすると、タイトルとコンテンツの内容を入力するフォームが表示されます。ここで適当に書いて送信すると、その内容をCloud Storageの「my_cloud_data」という名前のバケットに「sample.txt」という名前で保存します。
保存された内容は、helo.jspにアクセスした際にサーブレット経由でロードされ、画面に表示されます。さまざまにテキストを送信して、値が保存されていることを確認しましょう。また、動作が確認できたら、Cloud Storage Managerでバケットの中身を確認してみてください。「sample.txt」というファイルができているはずです。
ここでは、MyGaeAppServletのdoGetでファイルからのロードを、doPostでファイルへのセーブをそれそれ行うようにしています。helo.jspのフォームをPOST送信したら、その内容が保存されるというわけです。またhelo.jspでは、<jsp:include>を使ってMyGaeAppServletサーブレットを埋め込むことで、doGetで出力される内容を埋め込んで表示させています。
注意点としては、まずファイルをロードする際、openReadChannelをtry内で実行しています。openReadChannelは、指定したファイルが見つからなかった場合、FileNotFoundExceptionが発生します。これを処理する必要があります。
保存については、GSFileOptionsBuilderでファイルの設定情報を作成する際、メソッド類がすべてメソッドチェーンを使って続けて記述されていますね。この書き方は多用されるので覚えておくとよいでしょう。
また、MimeタイプはsetMimeType("text/html")としていますね。テキストデータですので、HTMLに指定しておきました。HTMLでないなら、"text/plain"でもよいでしょう。
アクセス権の設定は、setAcl("public_read")と設定しています。これは一般に読み込みを許可するという設定です。アクセス権には以下のようなものが用意されています。
下に、helo.jspとMyGaeAppServlet.javaのソースコードを掲載しておきました。これは、JSPベースで作られた投稿&内容表示ページと、そこから呼び出されるサーブレットで構成されています。helo.jspにアクセスすると、タイトルとコンテンツの内容を入力するフォームが表示されます。ここで適当に書いて送信すると、その内容をCloud Storageの「my_cloud_data」という名前のバケットに「sample.txt」という名前で保存します。
保存された内容は、helo.jspにアクセスした際にサーブレット経由でロードされ、画面に表示されます。さまざまにテキストを送信して、値が保存されていることを確認しましょう。また、動作が確認できたら、Cloud Storage Managerでバケットの中身を確認してみてください。「sample.txt」というファイルができているはずです。
ここでは、MyGaeAppServletのdoGetでファイルからのロードを、doPostでファイルへのセーブをそれそれ行うようにしています。helo.jspのフォームをPOST送信したら、その内容が保存されるというわけです。またhelo.jspでは、<jsp:include>を使ってMyGaeAppServletサーブレットを埋め込むことで、doGetで出力される内容を埋め込んで表示させています。
注意点としては、まずファイルをロードする際、openReadChannelをtry内で実行しています。openReadChannelは、指定したファイルが見つからなかった場合、FileNotFoundExceptionが発生します。これを処理する必要があります。
保存については、GSFileOptionsBuilderでファイルの設定情報を作成する際、メソッド類がすべてメソッドチェーンを使って続けて記述されていますね。この書き方は多用されるので覚えておくとよいでしょう。
また、MimeタイプはsetMimeType("text/html")としていますね。テキストデータですので、HTMLに指定しておきました。HTMLでないなら、"text/plain"でもよいでしょう。
アクセス権の設定は、setAcl("public_read")と設定しています。これは一般に読み込みを許可するという設定です。アクセス権には以下のようなものが用意されています。
project_privateとりあえず「非公開ならprivate、外部から読めてもいいならpublic_read」と覚えておくとよいでしょう。
private
public_read
public_read_write
authenticated_read
bucket_owner_read
bucket-owner_full_control
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※helo.jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ page import="java.util.ArrayList" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Sample jsp</title> <style> h1{ font-size: 16pt; background: #AAFFAA; padding: 5px; } table tr td { background: #DDFFDD; padding: 2px; } pre { background: #EEFFFF; padding: 5px; } </style> </head> <body> <h1>Hello App Engine!</h1> <hr> <pre id="msg"><jsp:include page="/mygaeapp"/></pre> <hr> <form method="post" action="/mygaeapp"> <table> <tr> <td>タイトル</td> <td><input type="text" id="title" name="title" size="40"></td> </tr> <tr> <td>コンテンツ</td> <td><textarea id="content" name="content" cols="40" rows="5"></textarea></td> </tr> <tr> <td></td> <td> <input type="submit" value="送信する"> </td> </tr> </table> </form> <hr> </body> </html> ※MyGaeAppServletクラス package com.tuyano.libro.mygaeapp; import java.io.*; import java.nio.channels.Channels; import javax.servlet.http.*; import com.google.appengine.api.files.*; import com.google.appengine.api.files.GSFileOptions.GSFileOptionsBuilder; @SuppressWarnings("serial") public class MyGaeAppServlet extends HttpServlet { public static final String BUCKETNAME = "my_cloud_data"; // バケット名 public static final String FILENAME = "sample.txt"; // ファイル名 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/plain"); request.setCharacterEncoding("utf8"); response.setCharacterEncoding("utf8"); PrintWriter out = response.getWriter(); String filename = "/gs/" + BUCKETNAME + "/" + FILENAME; FileService fileService = FileServiceFactory.getFileService(); AppEngineFile readableFile = new AppEngineFile(filename); FileReadChannel readChannel = null; try { readChannel = fileService.openReadChannel( readableFile, true); BufferedReader reader = new BufferedReader( Channels.newReader(readChannel, "UTF8")); String line = null; while((line = reader.readLine()) != null){ out.println(line); } } catch(FileNotFoundException e){ out.println("no file..."); } finally { try { readChannel.close(); } catch(Exception ex){} } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/plain"); request.setCharacterEncoding("utf8"); response.setCharacterEncoding("utf8"); String title = request.getParameter("title"); String content = request.getParameter("content"); FileService fileService = FileServiceFactory.getFileService(); GSFileOptionsBuilder optionsBuilder = new GSFileOptionsBuilder() .setBucket(BUCKETNAME) .setKey(FILENAME) .setMimeType("text/html") .setAcl("public_read"); AppEngineFile file = fileService .createNewGSFile(optionsBuilder.build()); FileWriteChannel writeChannel = fileService.openWriteChannel(file, true); PrintWriter ch_out = new PrintWriter(Channels .newWriter(writeChannel, "UTF8")); ch_out.println(title); ch_out.println(); ch_out.println(content); ch_out.close(); writeChannel.closeFinally(); response.sendRedirect("/helo.jsp"); } }
※関連コンテンツ
「Google App Engine for Java(GAE/J)プログラミング入門」に戻る