CloudinaryのPHP SDKを使ってAPIから画像をアップロードしてみた
はじめに
清水です。画像、動画といったデジタルメディア管理、変換サービスのCloudinary、その利点の1つとしてAPIでの操作が可能な点が挙げられます。今回はPHP用のSDKを使って、Cloudinary Management ConsoleからではなくAPI経由で画像をアップロードしてみました。なお筆者はPHPのコードを書いた経験はありますが、だいぶ昔のことだったり、PHPの最新事情に追いつけていなかったりなので、PHPの使い方、コーディング方法などにはまったくの素人レベルとお考えください。ドキュメントを確認しながらSDKが使えてみた!な具合のエントリになります。
ということで、基本となる公式ドキュメントについては下記になります。
またCloudinaryの概要については以下のエントリをご参照いただければと思います。
やってみた
PHP実行環境の準備
まずはPHPの実行環境の準備を行います。今回はAWS EC2上のAmazon Linux(2ではなく、1のほう)を使用しました。ログイン後、httpd24とphp72をyumでインストールします。 *1
$ ssh -i ~/.ssh/mykey.pem ec2-user@12.34.56.78 Last login: Fri Aug 31 08:32:24 2018 from 78.56.34.12 __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/ [ec2-user@ip-10-82-12-169 ~]$ sudo yum install -y httpd24 php72
CloudinaryのPHP SDKの準備
続いてCloudinaryのPHP用SDKをダウンロードします。Cloudinaryの公式ドキュメント、PHP integrationのGetting started guideを参考に行いましょう。今回はComposerを使わない、Basic installationで試しています。
「Download the latest sources from: https://github.com/cloudinary/cloudinary_php/tarball/master.」と記載がありChromeなどのブラウザからだとリンククリック後、リダイレクトしてダウンロードが始まりますが、CLI環境ではダウンロードにちょっとひと手間が必要です。以下のように一度curlでリダイレクト先を確認してダウンロードしました。ダウンロード後はtarballを解凍しておきます。
[ec2-user@ip-10-82-12-169 ~]$ curl https://github.com/cloudinary/cloudinary_php/tarball/master <html><body>You are being <a href="https://codeload.github.com/cloudinary/cloudinary_php/legacy.tar.gz/master">redirected</a>.</body></html> [ec2-user@ip-10-82-12-169 ~]$ curl https://codeload.github.com/cloudinary/cloudi nary_php/legacy.tar.gz/master > cloudinary_php.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 406k 0 406k 0 0 334k 0 --:--:-- 0:00:01 --:--:-- 334k [ec2-user@ip-10-82-12-169 ~]$ tar xzvf cloudinary_php.tar.gz
ダウンロードしたファイルのうち、src
ディレクトリ以下のファイルが実行に必要となります。今回はホームディレクトにupload_test
というディレクトリを作成、ここに自作のコードも置くのでsrc
ディレクトリ以下のファイルをここにまるっとコピーします。
[ec2-user@ip-10-82-12-169 ~]$ pwd /home/ec2-user [ec2-user@ip-10-82-12-169 ~]$ mkdir upload_test [ec2-user@ip-10-82-12-169 ~]$ cd upload_test/ [ec2-user@ip-10-82-12-169 upload_test]$ pwd /home/ec2-user/upload_test [ec2-user@ip-10-82-12-169 upload_test]$ cp -pra ../cloudinary-cloudinary_php-8c400bb/src/* ./ [ec2-user@ip-10-82-12-169 upload_test]$ ls -R .: Api Cloudinary.php Helpers.php Uploader.php Api.php CloudinaryField.php PreloadedFile.php cacert.pem AuthToken.php Error.php Search.php ./Api: AlreadyExists.php Error.php NotFound.php AuthorizationRequired.php GeneralError.php RateLimited.php BadRequest.php NotAllowed.php Response.php
アップロード用のPHPコードの準備
アップロード実行用のPHPのコードを、ファイル名upload.php
として作成します。
まずは冒頭に以下の3行を追加します。Cloudinaryのクラスを使う設定となります。
require 'Cloudinary.php'; require 'Uploader.php'; require 'Api.php';
続いてCloudiaryのアクセス情報の設定を行います。必要となるのはCloudinary cloud name(cloud_name
)とAPI Key(api_key
)、API Secret(api_secret
)です。こちらはCloudinary Management Consoleから情報を確認しましょう。
Cloudinary cloud nameはSettingsのAccountから確認できます。
API Key、API SecreteについてはSettingsのSecurityのページ、一番下にAccess Keysとして情報がまとまっています。API Secretについては*
をクリックすると実際の値が表示されます。
これらの情報を以下の形式にまとめて、requireのあとに記載します。my_cloud_name
、my_key
、my_secret
をそれぞれ置き換えましょう。
\Cloudinary::config(array( "cloud_name" => "my_cloud_name", "api_key" => "my_key", "api_secret" => "my_secret" ));
続いてアップロードの処理本体を記載します。公式ドキュメントのPHP image and video uploadの項目、Server-side uploadに記載があるように、upload
関数を利用すれば実現できそうです。引数としてファイル名だけですとCloudinary側でランダムな名前が割り振られるので、public_id
の情報も付与します。また確認のためupload関数の戻り値を変数$image_upload
に格納、print
で確認しています。
$image_upload = \Cloudinary\Uploader::upload( "/home/ec2-user/upload_test/testimage1.jpg", array( "resource_type" => "image", "public_id" => "upload_test/test1/image1.jpg" ) ); print var_export($image_upload , true);
以上をまとめたupload.phpがこちらになります。
<?php require 'Cloudinary.php'; require 'Uploader.php'; require 'Api.php'; \Cloudinary::config(array( "cloud_name" => "my_cloud_name", "api_key" => "my_key", "api_secret" => "my_secret" )); $image_upload = \Cloudinary\Uploader::upload( "/home/ec2-user/upload_test/testimage1.jpg", array( "resource_type" => "image", "public_id" => "upload_test/test1/image1.jpg" ) ); print var_export($image_upload , true); ?>
実際に画像ファイルをアップロードしてみる
それでは実際に画像ファイルをCloudinaryにアップロードしてみます。upload.php
13行目、upload
関数の1つ目の引数はアップロードするファイル名になります。実際にファイルを用意しておきましょう。
[ec2-user@ip-10-82-12-169 upload_test]$ pwd /home/ec2-user/upload_test [ec2-user@ip-10-82-12-169 upload_test]$ ls Api CloudinaryField.php Search.php upload.php Api.php Error.php Uploader.php upload.php~ AuthToken.php Helpers.php cacert.pem Cloudinary.php PreloadedFile.php testimage1.jpg
今回はPHPをコマンドラインから直接実行します。改めて環境を確認すると以下の具合です。
[ec2-user@ip-10-82-12-169 upload_test]$ pwd /home/ec2-user/upload_test [ec2-user@ip-10-82-12-169 upload_test]$ which php /usr/bin/php [ec2-user@ip-10-82-12-169 upload_test]$ php --version PHP 7.2.8 (cli) (built: Aug 17 2018 22:12:21) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
それでは実行してみます。以下のように、upload
関数が実行され戻り値が表示されました。
[ec2-user@ip-10-82-12-169 upload_test]$ php upload.php array ( 'public_id' => 'upload_test/test1/image1.jpg', 'version' => 153571XXXX, 'signature' => 'f7040f2aad947a3526f4a6beXXXXXXXXXXXXXXXX', 'width' => 900, 'height' => 1200, 'format' => 'jpg', 'resource_type' => 'image', 'created_at' => '2018-08-31T10:25:20Z', 'tags' => array ( ), 'bytes' => 141531, 'type' => 'upload', 'etag' => '1a61504bdd512697XXXXXXXXXXXXXXXX', 'placeholder' => false, 'url' => 'http://res.cloudinary.com/XXXXXXXX/image/upload/v153571XXXX/upload_test/test1/image1.jpg.jpg', 'secure_url' => 'https://res.cloudinary.com/XXXXXXXX/image/upload/v153571XXXX/upload_test/test1/image1.jpg.jpg', 'original_filename' => 'testimage1', )[ec2-user@ip-10-82-12-169 upload_test]$
アップロード結果を確認してみる
Cloudinary Management Consoleから確認してみましよう。左上のimage1.jpg
ががアップロードしたファイルです。
パス情報(フォルダ構成)もきちんと反映されていますね。以降は通常のCloudinary Management Consoleでアップロードしたときと同様に扱えます。
まとめ
CloudinaryのPHP SDKを使ってAPI経由で画像ファイルをCloudinaryにアップロードしてみました。今回は単純にSDKの使い方の確認程度として、コードとしてもファイル名をハードコーディングし、1つのファイルだけをアップロードしてみました。しかし、CloudinaryはPHP含め各種言語でSDKが用意されており、APIで操作できるので、例えば大量のファイルをアップロードする、またユーザが任意に画像ファイルを選択してアップロードするようなインターフェースも作成する、といったことができそうですね。引き続きCloudinaryの多様な機能を調査していきたいと思います。
脚注
- Cloudinaryの公式ドキュメント、PHP integrationの項目には「The library was tested with PHP 5.4」との記載があり、PHP 7.2の動作についてはサポートの旨の記載は見つけられませんでした。利用の際は検証の上、自己責任でご利用ください。 ↩