
批改狀態(tài):合格
老師批語:非常完整, 認真
// 自定義上傳異常類
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 {
// 上傳出錯的代碼
$errorCode = $_FILES['my_pic']['error'];
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('上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值', 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('找不到臨時文件夾', 6);
break;
case UPLOAD_ERR_CANT_WRITE:
throw new UploadException('文件寫入失敗', 7);
break;
default:
// 測試時建議關掉default: 避免誤報影響
throw new UploadException('未知類型錯誤', 8);
}
}
// 判斷文件類型
$fileType = $_FILES['my_pic']['type'];
if (strstr($fileType, '/', true) !== 'image') throw new UploadException('文件類型錯誤',9);
// 將文件從臨時目錄 移動到用戶自定義的目標目錄中
// 臨時文件名
$tempFileName = $_FILES['my_pic']['tmp_name'];
if (is_uploaded_file($tempFileName)) {
// 原始文件名
$originalFileName = $_FILES['my_pic']['name'];
// 目錄文件名
$destFileName = 'uploads/'.md5(time().mt_rand(1,1000)).strstr($originalFileName, '.');
// 移動文件到目標目錄使用的函數(shù)
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>文件上傳變量$_FILES</title>
</head>
<body>
<hr>
<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">
<button>上傳</button>
</fieldset>
</form>
</body>
</html>
上傳成功運行效果:
上傳錯誤運行效果:
<?php
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 {
foreach ($_FILES as $file) {
// 上傳出錯的代碼
$errorCode = $file['error'];
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('上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值', 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('找不到臨時文件夾', 6);
break;
case UPLOAD_ERR_CANT_WRITE:
throw new UploadException('文件寫入失敗', 7);
break;
default:
// 測試時建議關掉default: 避免誤報影響
throw new UploadException('未知類型錯誤', 8);
}
}
// 只要判斷 error === 0
if ($file['error'] === 0) {
// 判斷文件類型
// print_r($file) ;
$fileType = $file['type'];
if (strstr($fileType, '/', true) !== 'image') throw new UploadException('文件類型錯誤',9);
$tempFileName = $file['tmp_name'];
if (is_uploaded_file($tempFileName)) {
// 原始文件名
$originalFileName = $file['name'];
// 目錄文件名
$destFileName = 'uploads/'.md5(time().mt_rand(1,1000)).strstr($originalFileName, '.');
// 移動文件到目標目錄使用的函數(shù)
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>文件上傳變量$_FILES</title>
</head>
<body>
<hr>
<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">
<input type="file" name="my_pic2">
<input type="file" name="my_pic3">
<button>上傳</button>
</fieldset>
</form>
</body>
</html>
多文件上傳成功運行效果:
多文件上傳錯誤運行效果:
<?php
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 {
if ($_FILES['my_pic'])
// print_r($_FILES['my_pic']);
foreach ($_FILES['my_pic']['error'] as $key => $error) {
// 只要判斷 error === 0
// 上傳出錯的代碼
$errorCode=$_FILES['my_pic']['error'][$key];
if ($error === UPLOAD_ERR_OK) {
// 臨時文件名
$tmpFileName = $_FILES['my_pic']['tmp_name'][$key];
// 原始文件名
$originalFileName = $_FILES['my_pic']['name'][$key];
// 目標文件名
$destFileName = 'uploads/'. $originalFileName;
// 移動文件
move_uploaded_file($tmpFileName, $destFileName);
// 預覽
echo "<img src='{$destFileName}' width='200'>";
}else{
switch ($error) {
case UPLOAD_ERR_INI_SIZE:
throw new UploadException('上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值', 1);
break;
case UPLOAD_ERR_FORM_SIZE:
throw new UploadException('上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值', 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('找不到臨時文件夾', 6);
break;
case UPLOAD_ERR_CANT_WRITE:
throw new UploadException('文件寫入失敗', 7);
break;
default:
// 測試時建議關掉default: 避免誤報影響
// throw new UploadException('未知類型錯誤', 8);
}
}
// 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('上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值', 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('找不到臨時文件夾', 6);
// break;
// case UPLOAD_ERR_CANT_WRITE:
// throw new UploadException('文件寫入失敗', 7);
// break;
// default:
// // 測試時建議關掉default: 避免誤報影響
// // throw new UploadException('未知類型錯誤', 8);
// }
// }else{
// }
// if ($error === UPLOAD_ERR_OK) {
// // 臨時文件名
// $tmpFileName = $_FILES['my_pic']['tmp_name'][$key];
// // 原始文件名
// $originalFileName = $_FILES['my_pic']['name'][$key];
// // 目標文件名
// $destFileName = 'uploads/'. $originalFileName;
// // 移動文件
// move_uploaded_file($tmpFileName, $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>文件上傳變量$_FILES</title>
</head>
<body>
<hr>
<form action="" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>多文件上傳: 批量上傳</legend>
<input type="hidden" name="MAX_FILE_SIZE" value="3000000">
<!-- 將name屬性值能數(shù)組的形式提供 -->
<input type="file" name="my_pic[]" multiple>
<button>上傳</button>
</fieldset>
</form>
</body>
</html>
多文件批量上傳成功運行效果:
多文件批量上傳錯誤運行效果:
選擇文件->上傳到臨時目錄->轉存到指定目錄->反饋是否上傳成功
限制文件大小、限制文件類型、限制上傳方式、限制上傳數(shù)量等等,主要是保證服務器的安全及正常運行
目的是根據(jù)錯誤代號友好的反饋給用戶
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號