CloudinaryのPHP SDKを使ってAPIから画像をアップロードしてみた

画像、動画といったデジタルメディア管理、変換サービスのCloudinary、利点の1つとしてAPIでの操作が可能な点が挙げられます。PHP用のSDKを使って、Cloudinary Management ConsoleからではなくAPI経由で画像をアップロードしてみました。
2018.08.31

はじめに

清水です。画像、動画といったデジタルメディア管理、変換サービスのCloudinary、その利点の1つとしてAPIでの操作が可能な点が挙げられます。今回はPHP用のSDKを使って、Cloudinary Management ConsoleからではなくAPI経由で画像をアップロードしてみました。なお筆者はPHPのコードを書いた経験はありますが、だいぶ昔のことだったり、PHPの最新事情に追いつけていなかったりなので、PHPの使い方、コーディング方法などにはまったくの素人レベルとお考えください。ドキュメントを確認しながらSDKが使えてみた!な具合のエントリになります。

ということで、基本となる公式ドキュメントについては下記になります。

またCloudinaryの概要については以下のエントリをご参照いただければと思います。

Cloudinaryで画像変換を試してみた

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_namemy_keymy_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がこちらになります。

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.php13行目、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の多様な機能を調査していきたいと思います。

脚注

  1. Cloudinaryの公式ドキュメント、PHP integrationの項目には「The library was tested with PHP 5.4」との記載があり、PHP 7.2の動作についてはサポートの旨の記載は見つけられませんでした。利用の際は検証の上、自己責任でご利用ください。