Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:对于服务器来说, 用户的任何操作都是不可信任的, 必须要过滤, 特别是商业项目中
简单地上传一个文件,做简单的判断
<?php
// phpinfo();
// 查看上传的值
// printf('<pre>%s</pre>', print_r($_FILES, true));
// 查看系统对文件大小的限制
// echo '文件限制:'.ini_get('upload_max_filesize');
// 取得文件的参数,把参数简化一点;
$a=$_FILES['upfile'];
// printf('<pre>%s</pre>', print_r($a, true));
// 1)判断文件已上传
if ($a['error'] !==0) echo '没有文件上传;';
// 2)判断文件大小
switch ($a['error']){
case 1:
echo '文件超过指定的大小:'.ini_get('upload_max_filesize');
break;
case 2:
echo '文件超过表单要求的大小';
break;
default:
// echo '文件符合要求的大小';
}
// 3)判断文件格式是图片
if (strstr($a['type'],'/',true) !=='image') echo '文件不是图片;';
// 4) 判断是不是post上来的;
if (!is_uploaded_file($a['tmp_name'])) die('上传方式合法');
// 5) 把临时文件移到目标文件夹中,并重新生成文件名称
$targetfilename='../upload/'.md5(time().mt_rand(1,1000)).strstr($a['name'], '.');
if (move_uploaded_file($a['tmp_name'],$targetfilename )) {
// 6)预览一下图片
echo '<p>'.$a['name'].' : 上传成功~~</p>';
echo "<img src='{$targetfilename}' width='200'>";
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<fieldset>
<legend>文件上传</legend>
<input name="upfile" type="file">
<button>上传</button>
</fieldset>
</form>
</body>
</html>
在上面的基础上,加入自定义异常数判断,让代码更加完整
<?php
// $_FILES
$a=$_FILES['upfile'];
// printf('<pre>%s</pre>', print_r($a, true));
// 自定义上传异常类
class UploadException extends Exception
{
public function __toString()
{
return <<< UPLOAD
<ul>文件上传出错信息:
<li>代码:$this->code</li>
<li>信息:$this->message</li>
<li>文件:$this->file</li>
<li>行号:$this->line</li>
</ul>
UPLOAD;
}
}
try {
// 上传出错的代码
$errorCode = $a['error'];
if ($errorCode > 0) {
switch ($errorCode) {
case 1:
throw new UploadException('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值', 1);
break;
case 2:
throw new UploadException('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值', 2);
break;
case 3:
throw new UploadException('文件只有部分被上传', 3);
break;
case 4:
throw new UploadException('没有文件被上传', 4);
break;
case 5:
throw new UploadException('找不到临时文件夹', 6);
break;
case 7:
throw new UploadException('文件写入失败', 7);
break;
default:
throw new UploadException('未知类型错误', 8);
}
}
else{
// 判断文件类型
if (strstr($a['type'], '/', true) !== 'image') {throw new UploadException('文件类型错误', 9);}
// 判断是不是post上来的;
if (!is_uploaded_file($a['tmp_name'])) {throw new UploadException('请从表单上提交', 10);}
}
}
catch (UploadException $e) {
echo $e;
}
// 如果没报错,就称动文件
if (!$e)
{ // 将文件从临时目录 移动到用户自定义的目标目录中
if (is_uploaded_file($a['tmp_name'])) {
$destFileName = '../upload/'.md5(time().mt_rand(1, 1000)).strstr($a['name'], '.');
// 移动文件到目标目录使用的函数
if (move_uploaded_file($a['tmp_name'], $destFileName)) {
echo "<p>{$a['name']}: 上传成功~~</p>";
echo "<img src='{$destFileName}' width='200'>";
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<fieldset>
<legend>文件上传</legend>
<input name="upfile" type="file">
<input type="hidden" name="MAX_FILE_SIZE" value="500000">
<button>上传</button>
</fieldset>
</form>
</body>
</html>
<?php
// $_FILES
$a=$_FILES['upfiles'];
// printf('<pre>%s</pre>', print_r( $a, true));
if ($a){
foreach ($a['error'] as $key => $error) {
// 只要判断 error === 0 ,即就是有上传的
if ($error === 0) {
// 目标文件名,重新命名
if (is_uploaded_file($a['tmp_name'][$key])) {
$destFileName = '../upload/'.md5(time().mt_rand(1, 1000)).strstr($a['name'][$key], '.');
// 移动文件,如果是图片就移动,不是图片不移动
if (strstr($a['type'][$key], '/', true) === 'image') {
move_uploaded_file($a['tmp_name'][$key], $destFileName);
echo "<div>图片{$a['name'][$key]}上传成功:<img src='{$destFileName}' width='50'></div>";
} else {
echo "<div>文件{$a['name'][$key]}不是图片,上传不成功</div>";
}
}
}
else
{
echo "<div>文件{$a['name'][$key]}上传不成功</div>";
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<fieldset>
<legend>文件上传</legend>
<input type="file" name="upfiles[]" multiple>
<input type="hidden" name="MAX_FILE_SIZE" value="500000">
<button>上传</button>
</fieldset>
</form>
</body>
</html>