首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 圖片上傳完整實戰教程:兩種核心方案對比

     編輯:PHP 綜合知識

文件上傳是 PHP 開發高頻需求,本文對比兩種經典實現方案,涵蓋錯誤處理、類型驗證、安全命名、目錄掃描等完整流程。

方案一:純後端處理類(適合 API/異步上傳)

特點:無前端表單,專注後端邏輯,含完整錯誤碼映射、大小限制、類型白名單、時間戳命名、上傳後目錄列表展示。

<?php
// 錯誤碼處理
if ($_FILES['file']['error'] > 0) {
    $msg = ['', '文件大小超過服務器限制', '文件太大!', '文件只加載了一部分!', '文件加載失敗!'];
    exit('!problem: ' . ($msg[$_FILES['file']['error']] ?? '未知錯誤'));
}

// 大小限制 1MB
if ($_FILES['file']['size'] > 1000000) exit('文件過大!');

// 類型白名單
$allowed = ['image/jpeg' => '.jpg', 'image/gif' => '.gif'];
if (!isset($allowed[$_FILES['file']['type']])) exit('文件不是 JPG 或 GIF 圖片!');

// 安全命名:時間戳 + 正確擴展名
$ext = $allowed[$_FILES['file']['type']];
$filename = 'upfile/' . date("YmdHis") . $ext;

// 移動文件
if (is_uploaded_file($_FILES['file']['tmp_name'])) {
    if (!move_uploaded_file($_FILES['file']['tmp_name'], $filename)) exit('移動文件失敗!');
} else exit('problem!');

// 成功輸出
echo "<h1>success!</h1><br>";
echo "文件大小:{$_FILES['file']['size']} 字節<br>";
echo "文件路徑:$filename<hr>";

// 掃描上傳目錄
$dir = opendir('upfile/');
echo "$dir --Listing:<ul>";
while ($file = readdir($dir)) echo "<li>$file</li>";
echo "</ul>";
closedir($dir);
?>

方案二:表單自提交一體化(適合傳統頁面)

特點:單文件包含表單與處理邏輯,自動創建目錄、JS 提示跳轉、參數傳遞下一頁。

<?php
if (empty($_GET['submit'])) { ?>
<form enctype="multipart/form-data" action="?submit=1" method="post">
    Send this file: <input name="filename" type="file">
    <input type="submit" value="確定上傳">
</form>
<?php } else {
    $path = "uploadfiles/";
    if (!file_exists($path)) mkdir($path, 0700);

    $allowed = ["image/gif","image/pjpeg","image/png"];
    if (!in_array($_FILES["filename"]["type"], $allowed)) exit("格式不對");

    if ($_FILES["filename"]["name"]) {
        $file1 = $_FILES["filename"]["name"];
        $file2 = $path . time() . $file1; // 時間戳防重名
        $flag = 1;
    }
    if ($flag && move_uploaded_file($_FILES["filename"]["tmp_name"], $file2)) {
        echo "<script>alert('上傳成功!'); location='add_aaa.php?pname=$file2';</script>";
    }
} ?>

關鍵安全要點總結

  1. 檢查 $_FILES['error']:優於單純判斷文件大小,能捕獲上傳中斷、臨時目錄寫入失敗等異常
  2. 雙重大小限制:php.ini upload_max_filesize + 代碼邏輯二次校驗
  3. MIME 類型白名單:禁止執行腳本類型(php、exe、sh 等),注意 image/pjpeg 為 IE 上傳 JPEG 時的 MIME
  4. 文件名安全化:時間戳/UUID 重命名,避免中文文件名編碼問題與覆蓋風險
  5. is_uploaded_file + move_uploaded_file:雙重驗證防止偽造上傳請求
  6. 上傳目錄權限:設置為不可執行(Nginx/Apache 禁用腳本解析),權限 755 或 700
  7. 病毒掃描:生產環境建議集成 ClamAV 等掃描引擎

進階擴展建議

  • 分片上傳支援大文件(Plupload/WebUploader 前端 + 後端合併)
  • 圖片壓縮/縮略圖生成(GD/Imagick)
  • 雲存儲對接(阿里云 OSS、騰訊云 COS、七牛云)
  • 上傳進度條(Session/APCu/Redis 存儲進度)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved