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

PHP + IIS 環境下 Discuz/通用上傳失敗的權限配置解決方案

     編輯:PHP 相關知識

在 Windows Server + IIS + PHP 環境部署 Discuz!、WordPress 或其他 PHP 應用時,常遇到「上傳圖片/附件失敗」、「無法創建目錄」等問題。核心原因通常是 PHP 臨時上傳目錄未配置或該目錄缺乏 IIS 工作進程用戶(IUSR / IIS_IUSRS)的寫入權限。本文提供標準化排查與修復步驟。

故障現象

  • Discuz 後台「工具 → 更新緩存 → 上傳圖片」報錯/無響應。
  • PHP $_FILES['file']['error'] 返回 UPLOAD_ERR_NO_TMP_DIR (6) 或 UPLOAD_ERR_CANT_WRITE (7)。
  • 其他 CMS 附件上傳同樣失敗。

根因分析

  1. php.ini 中 upload_tmp_dir 未設置或註釋掉:PHP 預設使用系統臨時目錄(如 C:\Windows\Temp),但 IIS 工作進程無權限訪問。
  2. 指定的臨時目錄不存在:配置了路徑但未手動創建文件夾。
  3. 目錄權限缺失:IIS 用戶(IUSR、IIS_IUSRS、應用程序池身份)對目標目錄無「修改/寫入」權限。

標準修復步驟(以 PHP 7.4+ 為例)

1. 配置 php.ini 指定專用臨時目錄

; 找到 upload_tmp_dir 行,去掉分號註釋,設置為 PHP 安裝目錄下的 temp 文件夾
upload_tmp_dir = "D:\php\temp"
; 或絕對路徑
; upload_tmp_dir = "C:\php\temp"

建議:放在 PHP 安裝目錄下,避免系統臨時目錄權限複雜、被清理策略影響。

2. 創建目錄並設置 IIS 寫入權限(關鍵步驟)

  1. 資源管理器進入 D:\php\,新建文件夾 temp。
  2. 右鍵 temp → 屬性 → 安全 → 編輯 → 添加。
  3. 輸入對象名稱:IUSR → 檢查名稱 → 確定。
    同樣添加 IIS_IUSRS(組)和應用程序池身份(如 IIS AppPool\DefaultAppPool)。
  4. 勾選 修改(包含讀取/寫入/刪除)→ 確定應用。

IIS 目錄權限設置示例

3. 重啟 IIS 生效

命令行(管理員):
iisreset
; 或
net stop was /y && net start w3svc

4. 驗證修復

  • Discuz 後台 → 工具 → 更新緩存 → 上傳測試圖片 → 成功。
  • 編寫簡單 PHP 探針驗證:
<?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>

進階:PHP 上傳相關核心配置參數

指令默認值建議生產值說明
file_uploadsOnOn總開關
upload_tmp_dir系統臨時目錄D:\php\temp必須可寫
upload_max_filesize2M50M單文件上限
post_max_size8M60MPOST 總數據上限,必須 > upload_max_filesize
max_file_uploads2050單次請求最大文件數
max_execution_time30300大文件上傳需更長執行時間
memory_limit128M256M處理上傳文件時的內存上限

常見誤區提醒

  1. 只給 IUSR 權限不夠:IIS 7.5+ 默認使用應用程序池身份(IIS AppPool\池名)而非 IUSR,必須同時授權。
  2. 修改 php.ini 後未重啟 IIS:PHP 以 FastCGI 模式運行,修改配置必須回收應用程序池或 iisreset。
  3. 路徑包含中文/空格:臨時目錄路徑盡量純 ASCII、無空格,避免編碼問題。
  4. 防毒軟件攔截:服務器安全軟件(如 360、火綿)可能攔截 PHP 寫入臨時目錄,需加入信任區。

Discuz 專項提示

修復權限後,務必在後台執行 「工具 → 更新緩存」 並嘗試上傳一張圖片,確認全鏈路暢通。若仍失敗,檢查 config/config_global.php 中 $_config['ftp'] 設置是否誤啟用 FTP 模式(本地存儲應關閉)。

通過「指定專用目錄 + 賦予 IIS 寫入權限 + 重啟服務」三步走,可徹底解決 PHP + IIS 環境下的上傳權限難題,適用於 Discuz、WordPress、Typecho、ECShop 等所有 PHP 應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved