PHP图片上传脚本move_uploaded_file失效 临时变量为空问题
核心错误点
你的上传失败完全是代码拼写和变量使用错误导致的,和服务器配置、目录权限无关:
$_FILES超全局变量中,临时文件路径的键名是tmp_name,你写成了temp_name,键名不存在导致$tempname始终为空,move_uploaded_file()拿不到源文件路径自然执行失败。你自己print_r($_FILES)的时候就能看到数组里的正确键名,只是取值时拼写错误。- 调试时输出的
$folder变量在整段代码里从未定义,你实际存储上传目录路径的变量是$upload_dir,所以这个变量输出空是正常情况,和上传故障没有关系。
其他待修复的隐患
- 代码没有判断文件上传的错误码,哪怕上传过程中出现大小超限、部分上传、空文件等问题,也会直接执行后续逻辑,把无效数据写入数据库
- SQL语句直接拼接用户传入的参数,存在SQL注入风险
move_uploaded_file()执行后没有判断返回结果,文件移动失败也会继续写库- 调用
mysqli_error()时没有传入数据库连接参数$db,出错时拿不到正确的报错信息 - 前端表单必须设置
enctype="multipart/form-data"属性才能正常传输文件,你目前能在$_FILES中看到临时文件说明这个配置是对的,后续修改时注意不要删掉这个属性。
修正后的可运行代码
if(isset($_POST['submit'])) { $date = date('Y-m-d H:i:s'); // 对用户输入做转义,避免SQL注入,生产环境建议改用预处理语句 $subject = mysqli_real_escape_string($db, $_POST['subject']); $description = mysqli_real_escape_string($db, $_POST['description']); $upload_dir = './image'; $filename = $_FILES["choosefile"]["name"]; // 修正键名拼写错误 $tempname = $_FILES["choosefile"]["tmp_name"]; $upload_error = $_FILES["choosefile"]["error"]; // 先校验上传状态 if($upload_error !== UPLOAD_ERR_OK) { exit("文件上传失败,错误码:" . $upload_error); } // 执行文件移动,校验执行结果 if(move_uploaded_file($tempname, $upload_dir . "/" . $filename)) { $safe_filename = mysqli_real_escape_string($db, $filename); $insert = mysqli_query($db,"INSERT INTO xv.post (subject, description, creation_date, image) VALUES ('$subject', '$description', '$date', '$safe_filename')"); if(!$insert) { // 修正mysqli_error参数缺失问题 echo mysqli_error($db); } else { print "<p>调试信息:</p>"; print_r($_FILES); // 替换未定义的$folder为实际存在的$upload_dir变量 echo "<br>临时文件路径:" . $tempname . "<br>目标存储目录:" . $upload_dir; } } else { exit("文件从临时目录移动到目标目录失败"); } }
内容的提问来源于stack exchange,提问作者brnkvn
相关产品推荐
相关产品推荐

