質問: Cakephp3にてブログサイトを作ろうと考えています。会員制の投稿サイトでユーザー登録して 記事を投稿できるサイトです。 環境: php:7.1.1 Apache/2.4.25 (Win32) cakephp:3.2.11 MySQL:10.1.21-MariaDB 現状の構成はWeb+CakephpサーバーとDBサーバーとなっています。 記事を投稿する際は画像と含めてアップロードするようになっています。 現状は利用時の画像のアップロード先はデフォルトのCake内のapp/webroot/img/toukouimgとなっています。 ``` move_uploaded_file($tmp_name, 'img/toukouimg/'.$article->img_name); $temp_nameはアップロード前のファイル名 $article->img_nameはアップロード時に名前の重複を避ける為にユニークな名前に変えています。 ``` 投稿が増えた際には、Web+APの容量が増えていくのはまずいので、下記事項を考えています。 ファイルのアップロード先を別のサーバーに移す。(現在、さくらインターネットのクラウドのオブジェクトストレージを検討しています。) Cakephp3でどのようにオブジェクトストレージへのアップロードを行えばよいのか教えて頂きたく よろしくお願いします。
回答: 試したことがないのですが、私も気になったので調べてみました。 2つ方法がありそうです。 見当外れだったらすみません。 オブジェクトストレージをマウントする方法 オブジェクトストレージをマウントすれば、既存のPHPコードをほぼそのままで使えるようになるのではないでしょうか。 > > 現在、さくらインターネットのクラウドのオブジェクトストレージを検討しています。 > > > さくらインターネット株式会社の公式サイトも、オブジェクトストレージにアクセスするための、サードパーティー製のツールを紹介しています。 よくある質問(オブジェクトストレージ) の 「ツールのサポートはどのようになっていますか?」 ■さくらインターネット株式会社が運営する情報サイトで、具体的な方法が書いてありました。 S3QLでさくらのオブジェクトストレージサービスをローカルマウントしてみよう - さくらのナレッジ ここではパーミッションについて説明されていませんが、`--allow-other`オプションを付けてマウントすればアクセスできるようになります。説明のコードにはそのオプションが書かれていたので問題はありませんが......。念のため。 Mounting - S3QL 2.21 documentation ■こちらはQiitaの記事ですが、s3fsを使うやり方です。 さくらのクラウドのオブジェクトストレージをs3fsでマウントする さくらのクラウドでオブジェクトストレージをマウントする こちらもパーミッションでは少し悩むかもしれません。だいぶ前の話ですが、パーミッションに引っかかっていた方がいらっしゃいました。 s3fsを使ってEC2からS3をマウントしたときにうまくいかなくて調べた事まとめ PUTリクエストを送信する方法 クライアントからCakePHP3にファイルをアップロードするときの一時ファイルを、PUTリクエストによりオブジェクトストレージにアップロードすればいいと思います。 さくらインターネットサービス情報/企業情報の検索結果 → [pdf] オブジェクトストレージ API リファレンス CakePHP3でPUTリクエストを送る場合は、 guzzlehttp/guzzle が便利です。 インストールもComposerで一発ですし、書き方も簡単です。 ただもしかしたらPUTリクエストに必要なヘッダーの準備で少し悩むかもしれません。 リクエストが通るかどうか自信はありませんが、guzzlehttp/guzzle は次のような感じで使います。 ``` use GuzzleHttp\Client; $base_uri = 'http://example.com'; // APIアクセスのベースURI $host = 'test.example.com'; // My_Bucket_Name.b.sakurastorage.jp $file_path = '/path/to/tmp/image'; // アップロードした一時ファイルのパス $upload_path = '/path/to/image'; // ファイルの保存先 $client = new Client([ 'base_uri' => $base_uri, ]); $f = fopen($file_path, "r"); $response = $client->put($upload_path, [ 'body' => $f, // 不要なヘッダーがあるとさくらのAPI側がエラーを返す 'headers' => [ 'Host' => $host, 'Date' => gmdate ( \DateTime::RFC2822 ), 'Authorization' => 'user_name:token', 'User-Agent' => '', // さくらのAPI側で無視してくれるらしい 'Expect' => '', // 不要な項目なので空欄にして消す?(不明) ] ] ); ```