1.新しいlesson5というフォルダをドキュメントルート(htdocs)以下に作成する。
2.lesson5フォルダの中にuploadsというフォルダを作成する。パーミッションはユーザ、グループ、その他に対して読み書きの権限をあたえる。(666)
画像アップロード
3.lesson5の直下に以下のようにform.phpを作成する。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>PHPLesson</title> </head> <body> <p>ファイルアップロード</p> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="upfile"> <button type="submit">送信</button> </form> </body> </html>
4.lesson5の直下にupload.phpを以下のように作成する。
<?php $info=pathinfo($_FILES['upfile']['name']); /* print_r($_FILES['upfile']); print_r($info); exit; */ $ext=['gif','jpg','jpeg','png'];//許す拡張子のリスト $result=$_FILES['upfile']['error'];//エラーはあるか(0:UPLOAD_ERR_OKなら正常) if($result !==UPLOAD_ERR_OK){ //アップロードはエラーはないか? $error ='アップロードエラーが発生しました。'; }else if(!in_array(strtolower($info['extension']),$ext)){ //拡張子は許されたものか? $error='画像以外のファイルはアップロードできません。'; }elseif(!move_uploaded_file($_FILES['upfile']['tmp_name'],'uploads/'.time().'.'.$info['extension'])){ //書き込みに成功したか? $error='書き込みに失敗しました。'; } //エラーがあったら出力して終了 if(isset($error)){ die('error:'.$error); } //アップロードに成功したらformにリダイレクト /* print_r($_SERVER); exit; */ header('location:http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/form.php');
5.実行してみよう。画像をアップロードしてuploadsフォルダに画像が格納されれば成功だ。
6.同様に2〜3枚アップロードしてみよう。
ディレクトリの内容を表示
7.list.phpを以下のように作成する。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>PHPLesson</title> </head> <body> <p>ファイルリスト</p> <table border="1"> <tr><th>画像</th><th>ファイル</th><th>サイズ</th></tr> <?php const DOC_ROOT='./uploads/'; clearstatcache();//キャッシュクリア //ディレクトリの取得(ディレクトリのオープンに失敗したら終了(@はエラーを出力しないようにする)) $dir=@opendir(DOC_ROOT) or die('フォルダが開けませんでした。'); //ディレクトリの走査 while($file=readdir($dir)){ //ファイルか?(.や..やディレクトリが除外される) if(is_file(DOC_ROOT.$file)){ $path=DOC_ROOT.$file; ?> <tr> <td><img src="<?=$path?>" width="100"></td> <td><?=$file?></a></td></td> <td><?=round(filesize($path)/1024)?>kb</td> </tr> <?php } } closedir($dir); ?> </table> </body> </html>
8.実行してみよう。uploadsフォルダに入っている画像がすべて表示されれば成功だ。
ダウンロード機能の実装
9.先ほどのlist.phpの24行目を以下のように修正する。
<td><a href="download.php?file=<?=$file?>"><?=$file?></a></td></td>
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>PHPLesson</title> </head> <body> <p>ファイルリスト</p> <table border="1"> <tr><th>画像</th><th>ファイル</th><th>サイズ</th></tr> <?php const DOC_ROOT='./uploads/'; clearstatcache();//キャッシュクリア //ディレクトリの取得(ディレクトリのオープンに失敗したら終了(@はエラーを出力しないようにする)) $dir=@opendir(DOC_ROOT) or die('フォルダが開けませんでした。'); //ディレクトリの走査 while($file=readdir($dir)){ //ファイルか?(.や..やディレクトリが除外される) if(is_file(DOC_ROOT.$file)){ $path=DOC_ROOT.$file; ?> <tr> <td><img src="<?=$path?>" width="100"></td> <td><a href="download.php?file=<?=$file?>"><?=$file?></a></td></td> <td><?=round(filesize($path)/1024)?>kb</td> </tr> <?php } } closedir($dir); ?> </table> </body> </html>
10.download.phpを以下のように作成する。
<?php const DOC_ROOT='./uploads/'; $isContain=false;//ホワイトリストに含まれているか? /* ホワイトリストとなるディレクトリを指定 (このディレクトリ以外のファイルはダウンロードさせない) */ $dir=opendir(DOC_ROOT); //ディレクトリの走査 while($file=readdir($dir)){ if(is_file(DOC_ROOT.$file)){ $path=DOC_ROOT.$file;//対象となったパスを保存しておく //クエリで指定されたファイルがディレクトリにあればOK if($_GET['file']===$file){ //あったのでフラグをtrue $isContain=true; //抜ける break; } } } closedir($dir);//dirを閉じる //クエリで渡されたファイル名が不正だったら終了 if(!$isContain){ die('不正なパスが指定されました。'); } //不正でなければダウンロードする $filesize = filesize($path); header('Content-Type:application/octet-stream'); header('Content-Length:'.$filesize); header('Content-Disposition:attachment;filename='.$file); readfile($path);
11.list.phpのリンクをクリックして画像がダウンロードされれば成功だ。
ファイル削除の実装
12.list.phpを以下のように修正する。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>PHPLesson</title> </head> <body> <p>ファイルリスト</p> <a href="form.php">画像を登録</a> <table border="1"> <!--変更あり--> <tr><th>画像</th><th>ファイル</th><th>サイズ</th><th></th></tr> <?php const DOC_ROOT='./uploads/'; clearstatcache();//キャッシュクリア //ディレクトリの取得(ディレクトリのオープンに失敗したら終了(@はエラーを出力しないようにする)) $dir=@opendir(DOC_ROOT) or die('フォルダが開けませんでした。'); //ディレクトリの走査 while($file=readdir($dir)){ //ファイルか?(.や..やディレクトリが除外される) if(is_file(DOC_ROOT.$file)){ $path=DOC_ROOT.$file; ?> <tr> <td><img src="<?=$path?>" width="100"></td> <td><a href="download.php?file=<?=$file?>"><?=$file?></a></td></td> <td><?=round(filesize($path)/1024)?>kb</td> <!--変更あり--> <td><a href="unlink.php?file=<?=$file?>" onclick="return confirm('削除してよろしいですか?')">削除</a></td></td> </tr> <?php } } closedir($dir); ?> </table> </body> </html>
13.unlink.phpを以下のように作成
<?php const DOC_ROOT='./uploads/'; $isContain=false;//ホワイトリストに含まれているか? /* ホワイトリストとなるディレクトリを指定 (このディレクトリ以外のファイルはダウンロードさせない) */ $dir=opendir(DOC_ROOT); //ディレクトリの走査 while($file=readdir($dir)){ if(is_file(DOC_ROOT.$file)){ $path=DOC_ROOT.$file;//対象となったパスを保存しておく //クエリで指定されたファイルがディレクトリにあればOK if($_GET['file']===$file){ //あったのでフラグをtrue $isContain=true; //抜ける break; } } } closedir($dir);//dirを閉じる //クエリで渡されたファイル名が不正だったら終了 if(!$isContain){ die('不正なパスが指定されました。'); } //ファイルを削除 unlink($path); //listにリダイレクト header('location:http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/list.php');
14.upload.phpの最後の行を以下のように修正する。
header('location:http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/list.php');
15.以上で終了だ。Webアプリケーションにおいて画像の扱いは必須になってきている。基本的な扱い方法を理解しておこう。
コメント