解决IIS环境中PHP文件上传权限问题
在实践PHP文件上传功能时,遇到点击上传按钮无响应的情况。通过 var_dump($_FILES) 检查发现该数组为空,说明文件并未成功传递到服务器。
标准的HTML表单上传代码应包含以下关键要素:
<form action="../handler/upload.php" method="post" enctype="multipart/form-data">
<label><h2>选择文件:</h2></label>
<input type="file" name="uploaded_file">
<input type="submit" value="开始上传">
</form>
其中 enctype 属性必须设为 multipart/form-data,这是确保文件数据正确传输的关键设置。
处理上传请求的PHP脚本示例如下:
var_dump($_FILES);
if (isset($_FILES["uploaded_file"])) {
$target_path = "../storage/uploads/";
$result = move_uploaded_file(
$_FILES['uploaded_file']['tmp_name'],
$target_path . $_FILES['uploaded_file']['name']
);
if ($result) {
echo "文件上传完成,详情如下:<br>";
echo "文件名: " . $_FILES['uploaded_file']['name'] . "<br>";
echo "临时路径: " . $_FILES['uploaded_file']['tmp_name'] . "<br>";
echo "文件大小: " . $_FILES['uploaded_file']['size'] . " bytes<br>";
echo "MIME类型: " . $_FILES['uploaded_file']['type'] . "<br>";
echo "<hr>";
} else {
echo "上传失败,请检查权限设置";
}
}
正常情况下,$_FILES 数组应包含类似以下结构的数据:
array(1) {
["uploaded_file"]=>
array(5) {
["name"]=> string(12) "sample.jpg"
["type"]=> string(10) "image/jpeg"
["tmp_name"]=> string(27) "C:\temp\phpA1B2C3.tmp"
["error"]=> int(0)
["size"]=> int(102400)
}
}
初次测试时出现写入失败错误,这通常与IIS服务器权限配置相关。解决方案如下:
在IIS环境中,Web应用需要特定的文件系统权限才能执行写入操作。需要为目标目录配置适当的访问权限:
- 创建目标存储目录(如 /storage/uploads)
- 右键目录属性 → 安全选项卡
- 为 IIS_IUSRS 用户组添加写入权限
如果仍存在问题,可能需要扩大权限范围至整个 wwwroot 目录。此外需要注意上传路径的相对位置设置。
最终确认文件存储位置时发现,文件实际保存在处理脚本同级目录而非指定的目标目录。这是因为路径配置错误导致。修正 $target_path 变量指向正确的上级目录后问题得到解决。

关键配置要点包括:
- 严格管理Web服务器权限 - 确保上传目录具有适当读写权限
- 合理规划项目目录结构 - 提前设计好文件存储架构,便于权限分配
- 检查PHP配置参数 - 确认 php.ini 中的相关设置

upload_tmp_dir 参数定义了上传文件的临时存储位置。若未指定,Windows系统默认使用 C:\Windows\Temp 目录,并生成类似 php8FD1.tmp 的临时文件名。