このシリーズの目的
体系的なwebコーディングの訓練ができるようになるためにPHPの初学のきっかけかつ、PHPでログインフォームやフォームを実装することができるようになるために
上記のチュートリアルを進めているのでその備忘録。
内容
今回のチュートリアル
PHP Tutorial For Beginners: File Upload
このチュートリアルでやること
・PHPでのファイルのアップロードについて再度確認をする
成果物
<?php
if (isset($_POST['submit'])) {
// echo "<pre>";
// print_r($_FILES);
$targetfile = "uploads/".basename($_FILES['attachment']['name']);
$extension = pathinfo($targetfile,PATHINFO_EXTENSION);
// echo $extension;
if($_FILES['attachment']['size'] > 500000)
echo "your file is too big!";
else if($extension != "png" && $extension != "jpg" && $extension != "jpeg")
echo "Only the image files are allowed!";
else if(file_exists($targetfile))
echo "File with name already exists!";
else if(move_uploaded_file($_FILES['attachment']['tmp_name'],$targetfile))
echo "File Uploaded!";
}
?>
<!DOCTYPE html>
<html>
<head>
<title>PHP File Upload test</title>
</head>
<body>
<form action="index.php" method="post" enctype="multipart/form-data">
<input type="file" name="attachment"><br>
<input type="submit" name="submit" value="Upload">
</form>
</body>
</html>
大まかな手順
今回と次回はこれまでのチュートリアルで出てきたことについて改めて補足を兼ねて基本を確認する回である。今回はその7のチュートリアルでサクッと出てきた、PHPでのファイルのアップロードについて。
1.PHPの設定について
<?php
echo phpinfo();
?>
PHPのバージョンや設定を確認するためのコマンド。
直接ターミナル出力したり色々あるが、これはindex.phpを読み込むとwebブラウザで表示するようなものになっている。
確認して変更する項目があるなら今度はphp.iniを探して編集する。
今回用があるのはfile_uploadとfile_max_uploadの2項目。
前者はファイルのアップロード機能のオンオフ、後者はアップロードするファイルのサイズの上限を指定する項目なので、それぞれ目的に応じて編集する。
編集したら再起動(私はXAMPPで仮想環境を作っているのでXAMPPのApacheとMysqlを再起動する)し、もう一度phpinfoを確認して変更されているかどうか確認をする。
2.ファイルのアップロードのための下準備
その7でも触れたが、ファイルをアップロードした際には仮に保存されるフォルダとそこからファイルを移して保存しておくフォルダの2つが必要である。
前者は用意されているが、後者は自分で予め用意しておく必要があるので準備しておく。
3.今回実装する処理
・アップロードされるファイルサイズに制限をつける
・アップロードされるファイルの拡張子に制限をつける
・同一のファイルはアップロードされないようにする
今回想定されているファイルのアップロードは画像のアップロードなので、例えば動画ファイルやあまりにもサイズが大きいものは弾かれるようにしておくということ。
今回のコードの注釈
アップロードの基本であるbasename及びmove_upload_fileについては以下を参照してほしい。
$extension = pathinfo($targetfile,PATHINFO_EXTENSION);
pathinfoはパスを取得するための関数で具体的にはディレクトリ名、名前。拡張子、拡張子を覗いたファイルの名前が連想配列で取得される。
引数の次にオプションを設定すると連想配列の中から任意の値だけ返すようになる。
オプションは
オプション名 | 取得する値 | 例 |
---|---|---|
PATHINFO_DIRNAME | ディレクト名 | /home/test/web |
PATHINFO_BASENAME | ファイル名 | web.jpg |
PATHINFO_EXTENSION | 拡張子 | jpg |
PATHINFO_FILENAME | 拡張子なしのファイル名 | web |
と以上4つがあるので取得したい値に応じて指定する。
今回は拡張子を取得したいのでPATHINFO_EXTENSIONを指定する。