質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

3511閲覧

Cakephp3における画像ファイルアップロード時のオブジェクトストレージの利用について

nagasa

総合スコア35

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2017/05/10 09:07

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でどのようにオブジェクトストレージへのアップロードを行えばよいのか教えて頂きたく
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

試したことがないのですが、私も気になったので調べてみました。
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 が便利です。
https://github.com/guzzle/guzzle
インストールもComposerで一発ですし、書き方も簡単です。

ただもしかしたらPUTリクエストに必要なヘッダーの準備で少し悩むかもしれません。
リクエストが通るかどうか自信はありませんが、guzzlehttp/guzzle は次のような感じで使います。

PHP

1use GuzzleHttp\Client; 2 3$base_uri = 'http://example.com'; // APIアクセスのベースURI 4$host = 'test.example.com'; // My_Bucket_Name.b.sakurastorage.jp 5$file_path = '/path/to/tmp/image'; // アップロードした一時ファイルのパス 6$upload_path = '/path/to/image'; // ファイルの保存先 7 8$client = new Client([ 9 'base_uri' => $base_uri, 10]); 11 12$f = fopen($file_path, "r"); 13$response = $client->put($upload_path, 14 [ 15 'body' => $f, 16 // 不要なヘッダーがあるとさくらのAPI側がエラーを返す 17 'headers' => [ 18 'Host' => $host, 19 'Date' => gmdate ( \DateTime::RFC2822 ), 20 'Authorization' => 'user_name:token', 21 'User-Agent' => '', // さくらのAPI側で無視してくれるらしい 22 'Expect' => '', // 不要な項目なので空欄にして消す?(不明) 23 24 ] 25 ] 26);

投稿2017/05/13 12:06

coba-coba

総合スコア1409

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nagasa

2017/05/13 12:13

回答ありがとうございます。色々試行錯誤していまして、AWS-SDK for PHPなるものでできないか試していましたが、悪戦苦闘しています。早速、確認します。コードがかなり変わりそうで悩んでおりました。
nagasa

2017/05/13 12:36

オブジェクトストレージをマウントする方法はwebサーバーの増設に対応できるのでしょうか。ちょっと確認します。
coba-coba

2017/05/13 14:37

すでに見てるとは思いますが、以下のような説明はありますね。 簡単そうに見えますが、本当にできるのでしょうか……。 -------------------------- http://knowledge.sakura.ad.jp/tech/3208/ > ・S3QLは複数サーバーからの同時アクセスをサポートしていません。S3QLのドキュメントでは1台でマウントした後、NFSやCIFSなどで共有してからアクセスする例が紹介されています。 -------------------------- https://bitbucket.org/nikratio/s3ql/wiki/FAQ > Can I access an S3QL file system on multiple computers simultaneously? > To share a file system between several computers, you need to have a method for these computers to communicate, so that they can tell each other when they are changing data. However, S3QL is designed to store data in cloud storage services which can not be used for this kind of communication, because different computers may end up talking to different servers in the cloud (and there is no way for S3QL to force the cloud servers to synchronize quickly and often enough). > Therefore, the only way to share an S3QL file system among different computers is to have one "master" computer that runs mount.s3ql, and then shares the mountpoint over a network file system like NFS, CIFS or sshfs. If the participating computers are connected over an insecure network, NFS and CIFS should be combined with VPN software like Tinc (which is very easy to set up for a few computers) or OpenVPN (which is a lot more complicated). > In principle, both VPN and NFS/CIFS-alike functionality could be integrated into S3QL to allow simultaneous mounting using mount.s3ql directly. However, consensus among the S3QL developers is that this is not worth the increased complexity.
nagasa

2017/05/13 21:31

ありがとうございます。まずはプログラムの変更の少ない、マウント+NFS,CIFSの方法でできないか色々と試してみます。丁寧に説明頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問