
批改狀態(tài):合格
老師批語:寫得棒棒
<form action="" method="post" enctype="multipart/form-data">
<fieldset>
<legend>單文件上傳</legend>
<!-- 前端設(shè)置上傳文件的大?。鹤止?jié) -->
<!-- <input type="hidden" name="MAX_FILE_SIZE" value="5600"> -->
<input type="file" name="my_pic" id="">
<button>上傳</button>
</fieldset>
</form>
// $_FILES: 文件上傳變量,超全局的變量數(shù)組, 保存著所有與文件上傳的相關(guān)信息
printf('<pre>%s</pre>', print_r($_FILES, true));
// 自定義文件上傳的異類處理類
class UploadException extends Exception
{
public function __toString()
{
return <<<UPLOAD
<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>
<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: red;}
</style>
UPLOAD;
}
}
調(diào)用異常類
try
{
// 1.對錯誤代碼的判斷
$errorCode = $_FILES['my_pic']['error'] ?? null;
// 使用系統(tǒng)常量進(jìn)行判斷
if($errorCode>UPLOAD_ERR_OK){
switch ($errorCode){
case UPLOAD_ERR_INI_SIZE:
throw new UploadException('上傳的文件超過了php.ini 中 upload_max_filesize 選項限制的值',1);
break;
case UPLOAD_ERR_FORM_SIZE:
throw new UploadException('上傳的文件超出了表單中設(shè)置的大小',2);
break;
case UPLOAD_ERR_PARTIAL:
throw new UploadException('文件只有部分被上傳', 3);
break;
case UPLOAD_ERR_NO_FILE:
throw new UploadException('沒有文件被上傳', 4);
break;
case UPLOAD_ERR_NO_TMP_DIR:
throw new UploadException('找不到臨時文件夾', 5);
break;
case UPLOAD_ERR_CANT_WRITE:
throw new UploadException('文件寫入失敗', 6);
break;
default:
// 測試時建議關(guān)掉default: 避免誤報影響
throw new UploadException('未知類型錯誤', 7);
}
}
// 2.判斷文件類型是否正確
$fileType = $_FILES['my_pic']['type'] ?? null;
$type = strstr($fileType,'/',true);
if(!is_null($fileType)){
if($type!=='image') throw new UploadException('上傳類型錯誤',8);
}
}catch(UploadException $e){
echo $e;
}
// 判斷上傳方式是否正確?
// 臨時文件名
$tmplFileName = $_FILES['my_pic']['tmp_name'] ?? null;
// 1. 首先臨時文件是存在的,并且必須是通過POST上傳的
if ($tmplFileName && is_uploaded_file($tmplFileName)) {
// 2. 將文件從臨時目錄移動到目標(biāo)目錄中: uploads/
// move_uploaded_file(臨時文件, 目標(biāo)文件名)
// 原始文件名
$originalFileName = $_FILES['my_pic']['name'] ?? null;
echo strstr($originalFileName, '.');
// 目標(biāo)文件名
$destFileName = 'uploads/' . md5(time(). mt_rand(1,1000)) .strstr($originalFileName, '.');
if (move_uploaded_file($tmplFileName, $destFileName)) {
echo '<p>'. $_FILES['my_pic']['name'].': 上傳成功</p>';
// 預(yù)覽圖片
echo "<img src='{$destFileName}' width='200'>";
}
}
文件批量上傳中缺失的異常處理, 文件類型處理等操作
<form action="" method="post" enctype="multipart/form-data">
<fieldset>
<legend>批量上傳文件</legend>
<input type="file" name="my_pic1" id="">
<input type="file" name="my_pic2" id="">
<input type="file" name="my_pic3" id="">
<button>上傳</button>
</fieldset>
</form>
foreach ($_FILES as $k=>$file) {
// echo $k;
try
{
// 1.對錯誤代碼的判斷
$errorCode = $_FILES[$k]['error'] ?? null;
// 使用系統(tǒng)常量進(jìn)行判斷
if($errorCode>UPLOAD_ERR_OK){
switch ($errorCode){
case UPLOAD_ERR_INI_SIZE:
throw new UploadException('上傳的文件超過了php.ini 中 upload_max_filesize 選項限制的值',1);
break;
case UPLOAD_ERR_FORM_SIZE:
throw new UploadException('上傳的文件超出了表單中設(shè)置的大小',2);
break;
case UPLOAD_ERR_PARTIAL:
throw new UploadException('文件只有部分被上傳', 3);
break;
case UPLOAD_ERR_NO_FILE:
throw new UploadException('沒有文件被上傳', 4);
break;
case UPLOAD_ERR_NO_TMP_DIR:
throw new UploadException('找不到臨時文件夾', 5);
break;
case UPLOAD_ERR_CANT_WRITE:
throw new UploadException('文件寫入失敗', 6);
break;
default:
// 測試時建議關(guān)掉default: 避免誤報影響
throw new UploadException('未知類型錯誤', 7);
}
}
// 2.判斷文件類型是否正確
$fileType = $_FILES[$k]['type'] ?? null;
$type = strstr($fileType,'/',true);
if(!is_null($fileType)){
if($type!=='image') throw new UploadException('上傳類型錯誤',8);
}
}catch(UploadException $e){
echo $e;
}
}
if($file['error']===0){
$destFileName = 'uploads/' . md5(time().mt_rand(1,1000)) . strstr($file['name'],'.');
if(move_uploaded_file($file['tmp_name'],$destFileName)){
echo $file['name'].':上傳成功!'.'<hr>';
// 預(yù)覽圖片
echo "<img src='{$destFileName}' width='200'>";
}
}
*封裝一個文件上傳類,可同時處理單文件與多文件上傳(還在進(jìn)一步學(xué)習(xí))
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號