Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:上传, 想做到完美, 是非常困难的, 但做对不难
<?php
echo '超全局变量 $_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 === 0
if ($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 === 0
if ($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还是不完美,只能显示三个上传都出错的的画面。
—批量上传:可能代码多,都不能上传效果图了。