批改状态:合格
老师批语:上传, 想做到完美, 是非常困难的, 但做对不难
<?phpecho '超全局变量 $_FILES 数组的键值:';// $file = $_FILES;printf('<pre>%s</pre>',print_r($_FILES, true));echo '<hr>';$filesSize = $_FILES['my_pic']['size'];echo '允许的尽可能最大的文件上传(以字节为单位):' . ini_get('upload_max_filesize').'<hr>';if ($filesSize > 100000000 ) {echo '上传文件的大小超过最大限制!'.'<hr>';}else{echo '上传文件的大小小于最大限制!'.'<hr>';}if(strstr($_FILES['my_pic']['type'],'/',true) == 'image') {echo '上传的文件类型是image!'.'<hr>';}else{echo '上传的文件类型不是image!'.'<hr>';}if (is_uploaded_file($_FILES['my_pic']['tmp_name'])) echo $_FILES['my_pic']['name'] . '文件上传方式是合法的!'.'<hr>';// 自定义上传异常类class UploadException extends Exception{// 在异常子类中,可以访问并重写Exception中的四个属性,通过__toString()格式化异常输出信息public function __toString(){return <<< UPLOAD<style>table {border-collapse: collapse;border:1px solid black;text-align: center;}td {border:1px solid black;padding: 5px;}tr:first-of-type {background-color:#eee;}tr:last-of-type td {color: coral;}</style><table><tr><td>代码</td><td>信息</td><td>文件</td><td>行号</td></tr><tr><td>$this->code</td><td>$this->message</td><td>$this->file</td><td>$this->line</td></tr></table>UPLOAD;}}try{// 判断文件出错信息echo '文件状态 : ';$errcode = $_FILES['my_pic']['error'];switch($errcode){case '0':echo '文件上传成功!';echo '<hr>';break;case '1':throw new UploadException('文件超过`php.ini`中`upload_max_filesize`值!',1);echo '<hr>';break;case '2':throw new UploadException( '文件大小超过表单中`MAX_FILE_SIZE`指定的值!',2);echo '<hr>';break;case '3':throw new UploadException( '文件只有部分被上传!',3);echo '<hr>';break;case '4':throw new UploadException( '没有文件上传!',4);break;case '6':throw new UploadException( '文件上传成功找不到临时文件夹!',6);echo '<hr>';break;case '7':throw new UploadException( '文件写入失败!',7);echo '<hr>';break;default:throw new UploadException('未知类型错误', 8);}// 将文件从临时目录 移动到用户自定义的目标目录中// 临时文件名$tempFilename = $_FILES['my_pic']['tmp_name'];// echo $tempFilename;// die();if(is_uploaded_file($tempFilename)){// 原始文件名$originalFileName = $_FILES['my_pic']['name'];echo $originalFileName;// die();// 目录文件名$destFileName = 'uploads/'.$originalFileName;// echo $destFileName;// die();// 移动文件到目标目录使用的函数if (move_uploaded_file($tempFilename, $destFileName)) {echo "<p>$originalFileName: 上传成功~~</p>";// 预览echo "<img src='{$destFileName}' width='200'>";}}}catch (UploadException $e) {echo $e;}?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>单个文件上传</title></head><body><form action="" method="post" enctype="multipart/form-data" ><fieldset><legend>单个文件上传</legend><input type="hidden" name="MAX_FILE_SIZE" value="3000000" ><input type="file" name="my_pic" id="my_pic"><button type="submit">上传</button></fieldset></form></body></html>
上传成功的演示效果
上传出错的演示效果
<?php// echo '超全局变量 $_FILES 数组的键值:';printf('<pre>%s</pre>',print_r($_FILES, true));echo '<hr>';// 自定义上传异常类class UploadException extends Exception{// 在异常子类中,可以访问并重写Exception中的四个属性,通过__toString()格式化异常输出信息public function __toString(){return <<< UPLOAD<style>table {border-collapse: collapse;border:1px solid black;text-align: center;}td {border:1px solid black;padding: 5px;}tr:first-of-type {background-color:#eee;}tr:last-of-type td {color: coral;}</style><table><tr><td>代码</td><td>信息</td><td>文件</td><td>行号</td></tr><tr><td>$this->code</td><td>$this->message</td><td>$this->file</td><td>$this->line</td></tr></table>UPLOAD;}}try{// 判断文件出错信息echo '三个文件上传状态 : ';foreach($_FILES as $file){echo $file['error'];// die();}// $errcode = $_FILES['my_pic']['error'];switch($file['error']){case '0':echo '文件上传成功!';echo '<hr>';break;case '1':throw new UploadException('文件超过`php.ini`中`upload_max_filesize`值!',1);echo '<hr>';break;case '2':throw new UploadException( '文件大小超过表单中`MAX_FILE_SIZE`指定的值!',2);echo '<hr>';break;case '3':throw new UploadException( '文件只有部分被上传!',3);echo '<hr>';break;case '4':throw new UploadException( '没有文件上传!',4);break;case '6':throw new UploadException( '文件上传成功找不到临时文件夹!',6);echo '<hr>';break;case '7':throw new UploadException( '文件写入失败!',7);echo '<hr>';break;default:throw new UploadException('未知类型错误', 8);}foreach($_FILES as $file){// 只要判断 error === 0if ($file['error'] === 0){$destFileName = 'uploads/'.$file['name'];echo $destFileName;move_uploaded_file($file['tmp_name'] , $destFileName);echo "<img src='{$destFileName}' width='200' >" ;}}}catch (UploadException $e) {echo $e;}?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>多个文件上传</title></head><body><form action="" method="post" enctype="multipart/form-data" ><fieldset><legend>多个文件上传:逐个上传</legend><input type="hidden" name="MAX_FILE_SIZE" value="3000000" ><input type="file" name="my_pic1" id="my_pic1"><input type="file" name="my_pic2" id="my_pic2"><input type="file" name="my_pic3" id="my_pic3"><button type="submit">上传</button></fieldset></form></body></html>
上传成功的演示效果
上传出错的演示效果
<?php// echo '超全局变量 $_FILES 数组的键值:';printf('<pre>%s</pre>',print_r($_FILES, true));echo '<hr>';// 自定义上传异常类class UploadException extends Exception{// 在异常子类中,可以访问并重写Exception中的四个属性,通过__toString()格式化异常输出信息public function __toString(){return <<< UPLOAD<style>table {border-collapse: collapse;border:1px solid black;text-align: center;}td {border:1px solid black;padding: 5px;}tr:first-of-type {background-color:#eee;}tr:last-of-type td {color: coral;}</style><table><tr><td>代码</td><td>信息</td><td>文件</td><td>行号</td></tr><tr><td>$this->code</td><td>$this->message</td><td>$this->file</td><td>$this->line</td></tr></table>UPLOAD;}}try{// 判断文件出错信息echo '多个文件上传状态 : ';foreach($_FILES['my_pic']['error'] as $key=>$error){echo $error;// die();}// $errcode = $_FILES['my_pic']['error'];switch( $error){case '0':echo '文件上传成功!';echo '<hr>';break;case '1':throw new UploadException('文件超过`php.ini`中`upload_max_filesize`值!',1);echo '<hr>';break;case '2':throw new UploadException( '文件大小超过表单中`MAX_FILE_SIZE`指定的值!',2);echo '<hr>';break;case '3':throw new UploadException( '文件只有部分被上传!',3);echo '<hr>';break;case '4':throw new UploadException( '没有文件上传!',4);break;case '6':throw new UploadException( '文件上传成功找不到临时文件夹!',6);echo '<hr>';break;case '7':throw new UploadException( '文件写入失败!',7);echo '<hr>';break;default:throw new UploadException('未知类型错误', 8);}if($_FILES['my_pic'])foreach($_FILES['my_pic']['error'] as $key=>$error){// 只要判断 error === 0if ($error === 0){$tempFileName = $_FILES['my_pic']['tmp_name'][$key];$origFileName = $_FILES['my_pic']['name'][$key];$destFileName = 'uploads/'.$origFileName;move_uploaded_file($tempFileName , $destFileName);echo "<img src='{$destFileName}' width='200' >" ;}}}catch (UploadException $e) {echo $e;}?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>多个文件上传</title></head><body><form action="" method="post" enctype="multipart/form-data" ><fieldset><legend>多个文件上传:批量上传</legend><input type="hidden" name="MAX_FILE_SIZE" value="3000000" ><input type="file" name="my_pic[]" id="my_pic" multiple ><button type="submit">上传</button></fieldset></form></body></html>
上传成功的演示效果
上传出错的效果
总结:
1.文件上传有七个配置项,要熟记。
2.单个文件上传::熟记一个超全局变量:$_FILES
——它是一个二维数组,共有 5 个键名:
| 序号 | 键名 | 描述 |
|---|---|---|
| 1 | name |
文件在客户端的原始文件名(即存在用户电脑上的文件名) |
| 2 | type |
文件的 MIME 类型, 由浏览器提供, PHP 并不检查它 |
| 3 | tmp_name |
文件被上传到服务器上之后,在临时目录中临时文件名 |
| 4 | error |
和该文件上传相关的错误代码 |
| 5 | size |
已上传文件的大小(单位为字节) |
3.多文件上传
—逐个上传的异常处理有所不同,用了foreach 处理error还是不完美,只能显示三个上传都出错的的画面。
—批量上传:可能代码多,都不能上传效果图了。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号