form から input type="file" でファイルをアップロードをするときに、確認画面を挟んだりエラー画面を表示したり画面遷移をする際にも、アップロードするために選択されたファイルを画面ごとに持ちまわせるようなphpでの処理のやり方について解説します。
<? // 変数初期値 extract($_REQUEST); $msg = ""; $err = array(); $now = date("YmdHis"); $_FILES = isset($_FILES) ? $_FILES : array() ; $action = isset($action) ? $action : 0 ; $files = isset($files) ? $files : array() ; $form = isset($form) ? $form : array() ; $delfiles = isset($delfiles) ? $delfiles : array() ; // HTMLエンティティを特殊文字に戻す foreach($form as $key => $val) $form[$key] = htmlspecialchars_decode($val); if($action){ // ファイル削除のリクエストがある場合 foreach($delfiles as $key => $val){ @unlink($files[$key]["tmp_name"]); unset($files[$key]); } // 名前入力チェック if(empty($form["name"])) $err[] = "お名前 を入力してください"; // ファイルインフォデータベースを開く $finfo = finfo_open(FILEINFO_MIME_TYPE); // 仮アップロード foreach($_FILES as $key => $val){ if(!$val["tmp_name"]) continue; $files[$key]["name"] = $val["name"]; // アップロードされたファイルが画像かどうかチェック list($mime,$ext) = explode("/",finfo_file($finfo, $val["tmp_name"])); if($mime!="image") $err[] = "ファイル{$key} は画像を選択してください"; if($mime!="image") unset($files[$key]); if($mime!="image") continue; // 仮ディレクトリへファイルをアップロード copy($val["tmp_name"],"{$_SERVER['DOCUMENT_ROOT']}/updir/tmp/{$now}_{$key}.{$ext}"); $files[$key]["tmp_name"] = "{$_SERVER['DOCUMENT_ROOT']}/updir/tmp/{$now}_{$key}.{$ext}"; $files[$key]["url"] = "http://{$_SERVER['SERVER_NAME']}/updir/tmp/{$now}_{$key}.{$ext}"; } // ファイルインフォデータベースを閉じる finfo_close($finfo); // ファイルがあるかチェック if(!count($files)) $err[] = "少なくとも一つはファイルをアップロードしてください"; if(!count($err)){ if($action==2){ // 本アップロード foreach($files as $key => $val){ rename($val["tmp_name"],"{$_SERVER['DOCUMENT_ROOT']}/updir/".basename($val["tmp_name"])); $files[$key]["url"] = "http://{$_SERVER['SERVER_NAME']}/updir/".basename($val["tmp_name"]); } // 送信完了後のメール送信やメッセージなどの何らかの処理 $subject = "ファイルの送信が完了しました"; $text = "{$form['name']}様\n"; $text .= "以下のファイルの送信が完了いたしました。\n"; foreach($files as $key => $val) $text .= "<a href=\"{$val['url']}\" data-lightbox=\"files\">{$val['name']}</a>\n"; } }else{ // エラーメッセージ $msg = showerr($err); $action = 0; } } // 特殊文字をHTMLエンティティに変換する foreach($form as $key => $val) $form[$key] = htmlspecialchars($val); ?>
<?// 入力画面 if(!$action){?> <?=$msg?> <form action="/php/fileupload.html" method="post" enctype="multipart/form-data"> <table> <tr><th style="width:200px">お名前</th><td><input type="text" name="form[name]" value="<?=@$form["name"]?>" /></td></tr> <?for($i=1;$i<=5;$i++){?> <tr><th>ファイル<?=$i?></th><td><input type="file" name="<?=$i?>" /> <?if(isset($files[$i])){?> <a href="<?=$files[$i]["url"]?>" data-lightbox="files"><?=$files[$i]["name"]?></a> <input type="checkbox" name="delfiles[<?=$i?>]" value="1" id="delfiles<?=$i?>" /><label for="delfiles<?=$i?>">このファイルを削除</label><?}?> </td></tr> <?}?> </table> <p><input type="submit" value="送信内容を確認する" class="button" /></p> <input type="hidden" name="action" value="1" /> <?foreach($files as $key1 => $val1){?><?foreach($val1 as $key2 => $val2){?><input type="hidden" name="files[<?=$key1?>][<?=$key2?>]" value="<?=$val2?>" /><?}?><?}?> </form> <?// 確認画面 }elseif($action==1){?> <p>下記の内容でファイルを送信します。よろしければ「送信する」ボタンを押してください。</p> <table> <tr><th style="width:200px">お名前</th><td><?=$form["name"]?></td></tr> <?for($i=1;$i<=5;$i++){?> <tr><th>ファイル<?=$i?></th><td><?if(isset($files[$i])){?><a href="<?=$files[$i]["url"]?>" data-lightbox="files"><?=$files[$i]["name"]?></a><?}?></td></tr> <?}?> </table> <form action="/php/fileupload.html" method="post"> <p><input type="submit" value="送信する" class="button" /></p> <input type="hidden" name="action" value="2" /> <?foreach($files as $key1 => $val1){?><?foreach($val1 as $key2 => $val2){?><input type="hidden" name="files[<?=$key1?>][<?=$key2?>]" value="<?=$val2?>" /><?}?><?}?> <?foreach($form as $key => $val){?><input type="hidden" name="form[<?=$key?>]" value="<?=$val?>" /><?}?> </form> <form action="/php/fileupload.html" method="post"> <p><input type="submit" value="訂正する" class="button" /></p> <input type="hidden" name="action" value="0" /> <?foreach($files as $key1 => $val1){?><?foreach($val1 as $key2 => $val2){?><input type="hidden" name="files[<?=$key1?>][<?=$key2?>]" value="<?=$val2?>" /><?}?><?}?> <?foreach($form as $key => $val){?><input type="hidden" name="form[<?=$key?>]" value="<?=$val?>" /><?}?> </form> <?// 完了画面 }elseif($action==2){?> <p class="html pre"><?=$subject?></p> <p class="html pre"><?=$text?></p> <p><a href="/php/fileupload.html">送信フォームへ戻る</a></p> <?}?>
Copyright(C) systemexpress.co.jp All Rights Reserved. Author Takayuki Yukawa