質問: **現在の案** ・オリジナル画像データは、バッチ処理時に加工やサムネイル作成に使用するだけなので、/public_html/の下には置かない ・実際の表示に使用する画像データは、/public_html/の中で保存 ┏/オリジナル画像データ/ ┗/public_html/ ├/加工画像データ/ └/サムネイル画像データ/ --- **問題点** ・オリジナル画像データは、画像ファイルアップロードで追加する予定だったのですが、public_htmlの上なので、アップロードできない? --- **質問** ・画像ファイルをアップロードする際、public_htmlディレクトリ階層より上に保存することは可能でしょうか? ・オリジナル画像データは、普通どこに保存するのでしょうか? ・public_htmlディレクトリ階層より上に保存したりはしない? --- **補足** ・オリジナル画像データをpublic_htmlディレクトリ階層より上に保存しようとした理由は、普段使用しないデータなら、ブラウザでアクセスできない箇所に配置した方が安全だと考えたから
回答: > > public_htmlディレクトリ階層より上に保存することは可能でしょうか? > > > 「ドキュメントルート内にしか書き込めない」という制約はPHPにはありません。というか、PHPからドキュメントルートを確実に認識する術はないでしょう。 重要なのは保存先のパーミッションです。PHP はWebサーバーと同じ `www-data` や `httpd` といったユーザー、もしくはレンタルサーバなどでは各利用者のユーザーで動作していますから、このユーザーから書き込めるようにパーミッションを設定する必要があります。 ドキュメントルートより上の階層であろうと書き込みが許可されていれば保存できますし、逆に下の階層であっても書き込みが禁止されていれば保存できません。 なお通常 PHP でファイルアップロードを行う場合、PHP はそのファイルを一旦 `/tmp` などの一時ディレクトリに保存します。これを `move_uploaded_file()` などでお好みの場所に移動することになるでしょう。 参考 PHP: POST メソッドによるアップロード - Manual > > public_htmlディレクトリ階層より上に保存したりはしない? > > > ユーザーから無条件にアクセスさせたくないファイルは、ドキュメントルートの外側に置くことが多いと思います。Symfony や Laravel といったフレームワークでは、フレームワークを起動する `index.php` だけをドキュメントルートに置き、残りのスクリプト・設定・ログはその外に置いています。 `.htaccess` などで別途制限をかける方法もありますが、レンタルサーバーなどでドキュメントルートの外側にファイルを置けないといった事情がない限り、選択する理由はないでしょう。