在 Windows Server + IIS + PHP 環境部署 Discuz!、WordPress 或其他 PHP 應用時,常遇到「上傳圖片/附件失敗」、「無法創建目錄」等問題。核心原因通常是 PHP 臨時上傳目錄未配置或該目錄缺乏 IIS 工作進程用戶(IUSR / IIS_IUSRS)的寫入權限。本文提供標準化排查與修復步驟。
$_FILES['file']['error'] 返回 UPLOAD_ERR_NO_TMP_DIR (6) 或 UPLOAD_ERR_CANT_WRITE (7)。upload_tmp_dir 未設置或註釋掉:PHP 預設使用系統臨時目錄(如 C:\Windows\Temp),但 IIS 工作進程無權限訪問。IUSR、IIS_IUSRS、應用程序池身份)對目標目錄無「修改/寫入」權限。; 找到 upload_tmp_dir 行,去掉分號註釋,設置為 PHP 安裝目錄下的 temp 文件夾
upload_tmp_dir = "D:\php\temp"
; 或絕對路徑
; upload_tmp_dir = "C:\php\temp"
建議:放在 PHP 安裝目錄下,避免系統臨時目錄權限複雜、被清理策略影響。
D:\php\,新建文件夾 temp。temp → 屬性 → 安全 → 編輯 → 添加。IUSR → 檢查名稱 → 確定。IIS_IUSRS(組)和應用程序池身份(如 IIS AppPool\DefaultAppPool)。
命令行(管理員):
iisreset
; 或
net stop was /y && net start w3svc
<?php
// test_upload.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
var_dump($_FILES);
$tmp = $_FILES['f']['tmp_name'];
$dest = 'D:/php/temp/test_' . basename($_FILES['f']['name']);
if (move_uploaded_file($tmp, $dest)) {
echo "上傳成功,文件大小: " . filesize($dest);
} else {
echo "上傳失敗,錯誤碼: " . $_FILES['f']['error'];
}
}
?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="f"> <button>上傳測試</button>
</form>
| 指令 | 默認值 | 建議生產值 | 說明 |
|---|---|---|---|
| file_uploads | On | On | 總開關 |
| upload_tmp_dir | 系統臨時目錄 | D:\php\temp | 必須可寫 |
| upload_max_filesize | 2M | 50M | 單文件上限 |
| post_max_size | 8M | 60M | POST 總數據上限,必須 > upload_max_filesize |
| max_file_uploads | 20 | 50 | 單次請求最大文件數 |
| max_execution_time | 30 | 300 | 大文件上傳需更長執行時間 |
| memory_limit | 128M | 256M | 處理上傳文件時的內存上限 |
IIS AppPool\池名)而非 IUSR,必須同時授權。iisreset。修復權限後,務必在後台執行 「工具 → 更新緩存」 並嘗試上傳一張圖片,確認全鏈路暢通。若仍失敗,檢查 config/config_global.php 中 $_config['ftp'] 設置是否誤啟用 FTP 模式(本地存儲應關閉)。
通過「指定專用目錄 + 賦予 IIS 寫入權限 + 重啟服務」三步走,可徹底解決 PHP + IIS 環境下的上傳權限難題,適用於 Discuz、WordPress、Typecho、ECShop 等所有 PHP 應用。