PHP文件上传功能异常求助:配置无误仍无法完成上传
从你的调试信息来看,$_FILES['userfile']['error'] = 0,这说明PHP已经成功把文件接收到临时目录了——问题肯定出在move_uploaded_file这一步,大概率是目标目录的权限或者路径不对。给你几个排查方向:
1. 先确认相对路径是否指向正确目录
你用了相对路径'temp_files/',但PHP的相对路径是基于当前脚本的工作目录,而不一定是customer_details.php所在的platformDev目录(比如如果这个脚本是被其他文件include进去执行的,工作目录就会改变)。
可以在代码里加一行调试:
echo "Current working directory: " . getcwd();
看看输出的目录是不是你预期的platformDev。如果不是,要么改用绝对路径(比如$uploaddir = '/var/www/html/platformDev/temp_files/';,根据服务器实际路径调整),要么用脚本所在目录作为基准:
$uploaddir = __DIR__ . '/temp_files/'; // __DIR__会指向当前脚本所在的目录
2. 检查temp_files目录的写入权限
Web服务器的运行用户(比如Apache的www-data、Nginx的nginx)必须对这个目录有写入权限,否则move_uploaded_file根本没法把文件移进去。
你可以在代码里直接测试目录是否可写:
echo "Is upload directory writable? " . (is_writable($uploaddir) ? "Yes" : "No");
如果输出是No,就需要调整权限:
- 命令行修改权限:
chmod 755 /path/to/temp_files(给所有者读/写/执行权限,其他人读/执行权限) - 如果是目录所有者不对,修改所属用户:
chown www-data:www-data /path/to/temp_files(把www-data换成你的Web服务实际运行用户)
3. 排除文件名的潜在问题
虽然你的文件名看起来正常,但有时候空格、特殊字符或者重复文件名可能导致意外失败。可以先简化目标文件名测试:
$uploadfile = $uploaddir . 'test.xlsx'; // 用固定的简单文件名
如果这样能成功,那再回来处理原文件名的问题(比如用sanitize_file_name函数对原文件名做安全处理)。
4. 检查服务器的open_basedir限制
有些服务器会配置open_basedir,限制PHP只能访问指定的目录集合。如果你的temp_files不在允许的目录里,move_uploaded_file会悄悄失败。
可以用代码查看当前的open_basedir设置:
echo "open_basedir restriction: " . ini_get('open_basedir');
如果输出有内容,确认temp_files所在的目录在这个列表里,如果不在,需要调整服务器配置(比如修改php.ini或者.htaccess)把目录加进去,或者把temp_files移到允许的目录里。
内容的提问来源于stack exchange,提问作者artlemaks

