#本記事について
今後の開発の参考になればと思い、PHPについて、講義での実体験をまとめたもの。
##PHPのファイルアップロードについて
PHPではformを利用して画像ファイルの受け取り、アップロードが可能。
アップロードの流れは以下の通り
1.formからアップロード
2.tmp領域(一時保存場所)に保存
3.サーバの保存領域に移動
4.データベースに保存場所のパスを登録
##詰んだ内容
ファイルの権限設定をし忘れたことに気づかず、コードの記述ミスやパーミッション権限を疑ってハマった。
パーミッションはアップしたデータの修正、削除のみに使うため、疑うべきところが謝っていた。
##試したこと、疑ったコード
コメントしているfilename_to_save関数まではvar_dumpで確認できた。
そのため、パーミッション部分(if (move_uploaded_file以降以下)を疑った。
以下は、実際に記述したコード。
$img = $_FILES['img']['name'];
$img_data = "";
if (isset($_FILES['img']) && $_FILES['img']['error'] == 0) {
// 送信時OK
// 送信されてきたファイルの情報を取得
$uploaded_file_name = $_FILES['img']['name'];
$temp_path = $_FILES['img']['tmp_name'];
$directory_path = 'upload/';
// ファイル名の準備
$extension = pathinfo($uploaded_file_name, PATHINFO_EXTENSION);
$unique_name = date('YmdHis') . md5(session_id()) . "." . $extension;
$filename_to_save = $directory_path . $unique_name;
if (is_uploaded_file($temp_path)) {
// ここでtmpファイルを移動する
// var_dump($temp_path);
// var_dump($filename_to_save);
// exit();
if (move_uploaded_file($temp_path, $filename_to_save)) {
chmod($filename_to_save, 0644);
$img_data = $filename_to_save;
} else {
exit('Error:アップロードできませんでした');
}
} else {
exit('Error:画像がありません');
}
} else {
// 送信時エラー
exit('Error:画像が送信されていません');
}
// var_dump($filename_to_save);
// exit();
##原因と対策
原因:ファイルの権限設定をし忘れたため。
対策:ファイル権限を設定。※macのみの設定※windowsは特に設定の必要なし
「htdocs内の画像ファイルを格納するフォルダ」で
メニュー表示 => 情報を見る => 共有とアクセス権
全て「読み/書き」に変更 => 歯車ボタン => 内包している項目に適用
余談:
パーミッションを0644から0777に変更しなければ!などととんでもないことをしようとしていた。
今回の講義で指定しているパーミッションは「0644」。
オーナーが「6」、グループは「4」、一般が「4」という事になるので、
オーナーが「rw = 4+2 = 6」で読み込みと書き込みを許可、グループと一般が「r = 4」で読み込みだけを許可していることになる。
「0777」に変更した場合、オーナー、グループ、一般全て読み込み、書き込み、実行を許可すると言う意味になる…
本番環境に実装していたら、ユーザーが画像の読み書き、つまり編集&削除できる。
意味を理解せず、動く(ここでは画像がアップ、編集、削除できる)からといって安易に変更すべきではない。
最後に「全てを疑え!自分でさえも」と自分にも同じ道を通る人にも伝えたい。
##参考サイト
https://atmarkit.itmedia.co.jp/ait/articles/1605/23/news020.html
http://www.tryhp.net/permission.htm
以上。