Symfoware

Symfowareについての考察blog

EC2 + PHPで構築したサイトにアップロードしたファイルをAmazonS3に保存する

EC2にCodeIgniterが動く環境を作成しました。
はじめてのアマゾンウェブサービス(AWS) nginx + php-fpmでCodeIgniterを動かす

このサイトにアップロードフォームを作成。
アップロードされたファイルをS3に保存してみます。



S3のバケット作成



まず、S3のバケットを作成しました。

管理コンソールからS3を選択。
https://ap-northeast-1.console.aws.amazon.com/console/home

595_01.png


わかりやすく「Create Bucket」ボタンがあるのでクリック。

595_02.png


適当に「test」というBucketを作成してみます。

595_03.png


エラーになりました。
バケットの名前は全員でシェアされるので、ユニークなものを付けないといけません。


The requested bucket name is not available.
The bucket namespace is shared by all users of the system.
Please select a different name and try again.



595_04.png


「symfoware-test」という名前に変更して作成してみます。

595_05.png


作成できました。

595_06.png





AWS SDK for PHP



PHPからAWSのサービスを扱うためのSDKが公開されています。
AWS SDK for PHP

これを使用して、PHPからS3にアクセスします。

Composerをインストール。


$ cd /tmp
$ curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer



/usr/local/binにcomposerという名前でインストールしました。
バージョンを表示してみます。


$ composer --version
Composer version 1.0-dev (d57187446151ef84b28cb9f6b3ed38cc2cffc597) 2015-03-09 23:06:06




アプリケーションはCodeIgniterで作成します。
こちらを参考に、SDKのインストールを行いました。
【CodeIgniter】Composer(コンポーザー)を利用/インストールする方法

composer.jsonの書き方は、こちらを参考にしています。
Installing via Composer

CodeIgniterのapplicationフォルダに「composer.json」を作成。

以下の内容を記載します。


{
    "require": {
        "aws/aws-sdk-php": "2.*"
    }
}




applicationフォルダに移動。
composer installを実行します。


$ cd /var/www/ci3/application/
$ composer install




ここでこんなエラーが発生しました。
curl拡張が必要とのこと。


Loading composer repositories with package information
Installing dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

guzzle/guzzle v3.9.2 requires ext-curl * -> the requested PHP extension curl is missing from your system.




php5-curlをインストールして、再度実行。


$ sudo apt-get install php5-curl
$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing symfony/event-dispatcher (v2.6.4)
    Downloading: 100%        

- Installing guzzle/guzzle (v3.9.2)
    Downloading: 100%        

- Installing aws/aws-sdk-php (2.7.21)
    Downloading: 100%        

symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file
Generating autoload files




インストール出来ました。
application/venderというディレクトリが作成されます。


自動生成されたautoload.phpを読み込むようにしておきます。
どこに記載しても良いのですが、私はapplication/config/autoload.phpの末尾に一行追加しました。


  1. require APPPATH.'vendor'.DIRECTORY_SEPARATOR.'autoload.php';




※2015/3/30追記

application/config/config.phpで
$config['composer_autoload'] = TRUE;
とすることで自動的にロードされます。

CodeIgniter 3でComposer(コンポーザー)のautoload


これで準備完了です。






アップロードサンプル



こちらを参考にしました。
アップロードされたファイルをそのままAmazonS3に転送する
AWS SDK for PHPでAmazon S3にファイルをアップロードする


コントローラーの「Upload.php」はこのようになります。

CodeIgniter 3 ファイルアップロードクラス(Library Reference - File Uploading Class)
こちらで作成したものを流用しました。


  1. <?php
  2. class Upload extends CI_Controller {
  3.     
  4.     function __construct() {
  5.         parent::__construct();
  6.         
  7.         $this->load->helper(array('form', 'url'));
  8.     }
  9.     
  10.     public function index() {
  11.         
  12.         $this->load->view('upload/upload_form');
  13.         
  14.     }
  15.     
  16.     public function do_upload() {
  17.         
  18.         $s3 = $this->_connect_s3();
  19.         
  20.         date_default_timezone_set("Asia/Tokyo");
  21.         
  22.         $result = $s3->putObject(array(
  23.             'Bucket' => 'symfoware-test',
  24.             'Key'    => 'sample',
  25.             'SourceFile' => $_FILES['userfile']['tmp_name'],
  26.             'Metadata' => array(
  27.                 'type' => $_FILES['userfile']['type'],
  28.                 'size' => $_FILES['userfile']['size']
  29.             )
  30.         ));
  31.         
  32.         $this->load->view('upload/upload_success');
  33.         
  34.     }
  35.     
  36.     
  37.     public function show() {
  38.         
  39.         $s3 = $this->_connect_s3();
  40.         
  41.         $result = $s3->getObject(array(
  42.             'Bucket' => 'symfoware-test',
  43.             'Key'    => 'sample'
  44.         ));
  45.         
  46.         $this->output
  47.             ->set_content_type('jpeg')
  48.             ->set_output($result['Body']);
  49.         
  50.     }
  51.     
  52.     private function _connect_s3() {
  53.         
  54.         $s3 = Aws\S3\S3Client::factory(array(
  55.             'key'    => 'AWXACCESSKEYID',
  56.             'secret' => 'AWSSECRETACCESSKEY',
  57.             'region' => 'ap-northeast-1'
  58.         ));
  59.         
  60.         return $s3;
  61.     }
  62.     
  63.     
  64. }




指定するkeyとsecretの値はこちらで取得したものです。
はじめてのアマゾンウェブサービス(AWS) コマンドでEC2インスタンスを起動する


ビューはこのようになります。

・upload/upload_form.php


  1. <html>
  2. <head>
  3.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4.     <title>S3テスト</title>
  5. </head>
  6. <body>
  7.     
  8. <?php echo form_open_multipart('upload/do_upload');?>
  9. <input type="file" name="userfile" size="20" />
  10. <br /><br />
  11. <input type="submit" value="upload" />
  12. </form>
  13. </body>
  14. </html>




・upload/upload_success.php


  1. <html>
  2. <head>
  3.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4.     <title>S3テスト</title>
  5. </head>
  6. <body>
  7. <ul>
  8. <img src="/upload/show">
  9. <p><?php echo anchor('upload', 'Upload Another File!'); ?></p>
  10. </body>
  11. </html>





適当にファイルを選択してアップロード。

595_07.png


S3に登録した内容を取得し、画面に表示します。

595_08.png


管理コンソールからも、ファイルが登録されたことが確認できました。

595_09.png




【参考URL】

【CodeIgniter】Composer(コンポーザー)を利用/インストールする方法/

Installing via Composer

アップロードされたファイルをそのままAmazonS3に転送する

AWS SDK for PHPでAmazon S3にファイルをアップロードする
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/03/12(木) 23:22:50|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<nginxで動的に画像をリサイズする(ngx_small_light使用) | ホーム | CodeIgniter 3 ファイルアップロードクラス(Library Reference - File Uploading Class)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1689-b5a2325b
この記事にトラックバックする(FC2ブログユーザー)