Ubuntu+Apache2+PHP环境下文件上传报错“无法写入目标文件”求助
文件上传功能失效排查与修复思路
问题描述
代码本应实现文件上传功能,但运行时显示Cannot write to destination file。服务器文件归属www-data,目标文件夹projects归属www-data且权限为0777,无重大错误提示。
原代码
<form name="submit" action="#" method="post" enctype="multipart/form-data"> <input type="file" value="Choose file" id="pic" name="pic"> <input type="submit" value="Upload" name="submit"> </form> <?php ini_set('display_startup_errors', 1).'<br>'; ini_set('display_errors', 1).'<br>'; error_reporting(-1).'<br>'; session_start(); $pic = $_FILES["pic"]["name"]; $folder = 'projects'; $path = $folder.'/'.$pic; if (!is_writeable($path)) { die("Cannot write to destination file"); } else{ move_uploaded_file($_FILES["pic"]["tmp_name"], $path); echo $path.'<br>'; echo 'DONE'; } print_r($_FILES); ?>
解决思路
1. 修正核心判断逻辑错误
当前代码直接判断目标文件路径是否可写,但上传前该文件大概率不存在,is_writeable()对不存在的文件会返回false,直接触发die。正确逻辑应先检查目标文件夹是否可写:
$folder = 'projects'; // 先确保文件夹存在且可写 if (!is_dir($folder)) { mkdir($folder, 0777, true); // 递归创建文件夹(如果需要) } if (!is_writeable($folder)) { die("目标文件夹不可写"); }
2. 增加请求类型判断
页面首次加载时(非POST请求),$_FILES["pic"]不存在,直接访问会引发未定义索引错误。需先判断是否为POST提交再执行上传逻辑:
if ($_SERVER['REQUEST_METHOD'] === 'POST') { session_start(); // 后续上传代码放在这里 }
3. 修复表单action属性
action="#"可能导致提交后URL异常,影响PHP接收POST数据。建议显式指定当前脚本路径:
<form name="submit" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
4. 检查目标文件是否已存在且权限异常
如果projects文件夹内已存在同名文件,且该文件的归属/权限不是www-data可写,也会触发错误。可添加文件存在判断,选择覆盖或重命名:
$pic = $_FILES["pic"]["name"]; $path = $folder . '/' . $pic; // 如果文件已存在,重命名(示例:添加时间戳) if (file_exists($path)) { $ext = pathinfo($pic, PATHINFO_EXTENSION); $filename = pathinfo($pic, PATHINFO_FILENAME); $path = $folder . '/' . $filename . '_' . time() . '.' . $ext; }
5. 排查PHP上传配置限制
检查php.ini中的以下参数,确保未超出限制:
upload_max_filesize: 单个上传文件的最大大小post_max_size: POST请求的最大数据量max_execution_time: 脚本最大执行时间
内容的提问来源于stack exchange,提问作者Mary N
相关产品推荐
相关产品推荐

