書籍転載
Windows Azure 実践クラウド・プログラミング
for C#/Visual Basic/PHP

PHPでWindows Azureブロブ・ストレージを活用しよう
― Chapter 7 PHPによるWindows Azureアプリケーション開発(中編) ―

山田 祥寛
2010/09/01
Page1 Page2

[2]画像アップロード&アルバム表示のコードを記述する

 新規のAlbum.phpを作成し、リスト7-4のようなコードを記述します。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<meta http-equiv="Content-Type"
  content="text/html; charset=utf-8">
<title>簡易アルバム</title>
</head>
<body>
<!--ポストデータは自分自身に送信-->
<form method="POST" enctype="multipart/form-data" action="">
  ファイル名:
  <input type="file" name="upfile" size="50" /><br />
  備考:
  <input type="text" name="txtMemo" size="50" /><br />
  <input type="submit" value="アップロード" />
</form>
<?php
// 必要なライブラリをインポート
require_once 'MyLib.php';

$cont = 'phpimages'; // アップロード先のコンテナ名
$cli = createBlobStorageClient(); // ブロブクライアントの取得


// コンテナが存在しない場合、新規にコンテナを生成
if (!$cli->containerExists($cont)) {
  $cli->createContainer($cont,
    array('name' => urlencode('PHPサンプル')));
  $cli->setContainerAcl($cont,
    Microsoft_WindowsAzure_Storage_Blob::ACL_PUBLIC);
}


// アップロードファイルが指定された場合、ブロブの登録処理
if (isset($_FILES['upfile'])) {
  $blob = $cli->putBlob($cont,
    uniqid(date('YmdHis_')),
    $_FILES['upfile']['tmp_name'],
    array('memo' => urlencode($_POST['txtMemo']))
  );
}


// コンテナ配下のブロブ一覧を取得&順に表示
$blobs = $cli->listBlobs($cont);
?>
<table border="1">
<tr>
  <th>画像</th><th>サイズ</th><th>更新日</th><th>備考</th>
</tr>
<?php foreach($blobs as $blob) {
  // 現在のブロブに含まれるメタデータを取得
  $meta = $cli->getBlobMetadata($cont, $blob->name);
  ?>
  <tr>
  <td>
    <a href="<?php print $blob->Url; ?>">
      <img src="<?php print $blob->Url; ?>"
        height="50" width="60" border="0" /></a>
  </td>
  <td><?php print $blob->size / 1024 ?>キロバイト</td>
  <td><?php print $blob->lastModified ?></td>
  <td><?php print $meta ? urldecode($meta['memo']) : '&nbsp;'; ?>
  </td>
  </tr>
<?php } ?>

</table>
</body>
</html>
リスト7-4 Album.php

 大まかなコードの流れはリスト内のコメントを参照頂くとして、以下ではブロブ操作に関わる部分をいくつかのブロックに分けて解説していきます。

コンテナを作成する

 最初に、ブロブの保存先となるコンテナ(ここではphpimages)を作成します。containerExistsメソッドでコンテナの存在チェックをした後、存在しない場合にのみcreateContainerメソッドでコンテナを作成します。

Microsoft_WindowsAzure_Storage_BlobContainer createContainer(string $container [,array $meta])
構文 createContainerメソッド
  $container:コンテナ名
  $meta:メタデータ(キー/値の連想配列)

 メタデータにマルチバイト文字などが含まれている場合には、urlencode関数でエンコード処理を忘れないようにしてください。

 また、エンドユーザが配下のブロブにアクセスできるよう、setContainerAclメソッドで公開アクセス権限をコンテナに付与しておきます。

void setContainerAcl(string $container [,bool $acl = self::ACL_PRIVATE])
構文 setContainerAclメソッド
  $container:コンテナ名 $acl:アクセス許可レベル(ACL_PRIVATE|ACL_PUBLIC)

 サンプルでは簡略化のために処理の最初にコンテナの作成処理を行っていますが、実際のアプリケーションでは、余計なオーバヘッドを課すべきではありません。セットアップスクリプトなどを用意し、必要なコンテナ/テーブルなどはあらかじめ作成しておくようにするべきでしょう*23

*23 もちろん、Cloud Strage Studioなどから手動で作成しても構いません。

アップロードファイルをブロブにアップロードする

 は[アップロード]ボタンからポストされた場合の処理です。アップロードされたファイルを更にブロブにアップロードするには、putBlobメソッドを利用します。

Microsoft_WindowsAzure_Storage_BlobInstance putBlob(string $container, string $blob, string $local [,array $meta [,array $add]])
構文 putBlobメソッド
  $container:コンテナ名
  $blob:ブロブ名
  $local:アップロードするファイル名
  $meta:メタデータ(キー/値の連想配列)
  $add:追加のヘッダ情報

 ブロブ名(引数$blob)には、uniqid関数で「YYYYMMDDHHmmSS_.」(日付)で始まる一意な名前を割り当てます*24

 アップロードするファイル名(引数$local)は、スーパーグローバル変数$_FILESのtmp_nameキーにセットされていますので、これをそのまま引き渡すだけです*25

*24 ファイル名の重複に備えて、元のアップロードファイル名は使いません。オリジナルの名前を維持したいならば、メタデータに保存しても良いでしょう。
*25 ただし、本書ではサンプルの簡単化を優先して、画像以外のファイルをアップロードした場合にも特にエラーなどは発生させていません。実際のアプリケーションでは、入力データの検証は欠かせません。

ブロブの一覧を取得する

 コンテナ配下のブロブリストを取得するには、listBlobsメソッドを呼び出すだけです。listBlobsメソッドは、戻り値としてMicrosoft_WindowsAzure_Storage_BlobInstanceオブジェクト(ブロブ本体)の配列を返します。

 ここではforeachループで順に配列からブロブを取り出し、その属性情報を列挙しているわけです。ただし、メタデータはデフォルトでは取得されませんので、getBlobMetaDataメソッドで個別に取得している点に注意してください。

array getBlobMetadata(string $container, string $blob)
構文 getBlobMetaDataメソッド
  $container:コンテナ名
  $blob:ブロブ名

 その他、Microsoft_WindowsAzure_Storage_BlobInstanceオブジェクトでアクセス可能なメンバについては、P.456(※本転載では割愛)も合わせて参照してください*26

*26 本来は取得した数値の小数点を切り捨てたり、日付を日本標準時に変更したりすべきですが、本項では割愛しています(以降も同様)。

[3]サンプルの動作を確認する

 以上の手順を終えたら、開発ファブリックでサンプルを実行してみましょう。本稿冒頭の図のようなページが表示されたら、ローカルマシンの画像ファイルが正しくアップロードできること、アップロードされた画像ファイルが正しく一覧表示できることを確認してください。

 また、ストレージエクスプローラからも作成されたブロブ情報を確認しておきましょう。

図7-21:phpimagesコンテナ配下のブロブを確認

 ブロブの内容を確認するには、該当するブロブを右クリックし、表示されたコンテキストメニューから[View in Browser]を選択します。

クラウド環境への移行

 ストレージアクセスを伴うサービスをクラウド環境に移行するには、あらかじめストレージアカウントを登録した上で、接続文字列の設定を行う必要があります*27。ストレージアカウントの登録については、P.48(※本転載では割愛)で解説済みですので、合わせて参照してください。

*27 デフォルトでは、無条件に開発ストレージに接続する設定になっています。

 接続文字列を設定するには、PHPエクスプローラから該当するクラウドサービスプロジェクトのプロパティシートを開き、左ツリーから[Windows Azure]−[Service Configuration]を選択します。

図7-22:[<プロジェクト名>のプロパティ]ダイアログ

 [RoleSettings]欄から該当するロール(ここでは「WebRole」)を選択し、[編集]ボタンをクリックします。

図7-23:[Add Role Element]ダイアログ

 [Add Role Element]ダイアログが開きますので、[ConfigurationSettingsGroup]欄から、それぞれAzureCloudStorageAccountName(アカウント名)、AzureCloudStorageAccountKey(アカウントキー)を入力してください。

 以上でストレージ接続の準備は完了ですので、「PHP+Azureアプリケーションの基本」の「[5]クラウド環境にプロジェクトを発行する」の要領でクラウド環境にアップロードし、正しくストレージにアクセスできることを確認してください。

 次回はテーブルストレージ利用の基本について説明します。End of Article


 INDEX
  [書籍転載]Windows Azure 実践クラウド・プログラミング for C#/Visual Basic/PHP
  PHPでWindows Azureブロブ・ストレージを活用しよう
    1.ブロブストレージ利用の基本
  2.クラウド環境への移行

インデックス・ページヘ 「Windows Azure 実践クラウド・プログラミング for C#/Visual Basic/PHP」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間