PHP报finfo_file空路径警告 开发文件管理系统上传图片失败如何解决
问题原因
你遇到的问题是多处代码错误共同导致的,具体如下:
- 提交方法不匹配:文件上传必须使用POST请求,你的代码使用
$_GET['submit']判断提交,GET请求无法携带上传的文件数据,导致$_FILES全局变量为空,$_FILES["imagefile"]["tmp_name"]无有效值,所以触发finfo_file()空路径报错。你观察到的$fileinfo返回false是误判,实际是finfo_file()执行失败返回false,原因就是传入的临时文件路径为空。 - 存在多处变量名拼写错误:
move_uploaded_file()第一个参数写为错误的$_FILES['fimagefileile']['tmp_name'],正确应为$_FILES['imagefile']['tmp_name']- 保存目标文件名错误使用
$_FILES['file']['name'],正确应为$_FILES['imagefile']['name']
- 逻辑判断顺序错误:代码先读取文件大小、再判断上传错误码,如果文件上传失败(
$_FILES['imagefile']['error']不为0),直接访问size、tmp_name等字段都会触发异常。 - 可选权限问题:如果images目录没有给PHP进程写入权限,也会导致最终移动文件失败。
修复方案
步骤1:修改前端表单
文件上传表单必须添加method="post"和enctype="multipart/form-data"属性,示例如下:
<form method="post" enctype="multipart/form-data"> <input type="file" name="imagefile"> <button type="submit" name="submit">上传</button> </form>
步骤2:修改PHP代码
修正提交判断、逻辑顺序和变量拼写错误,修复后的完整代码如下:
<?php // 改为判断POST提交 if(isset($_POST['submit'])) { // 优先判断上传是否成功 if($_FILES['imagefile']['error'] !== UPLOAD_ERR_OK) { echo "<br>上传错误,错误码:". $_FILES['imagefile']['error']."<br>"; exit; } // 再判断文件大小 if($_FILES['imagefile']['size'] < 3000000) { $accepted = ["image/png", "image/jpeg", "image/jpg", "image/gif"]; $fileinfo = finfo_open(FILEINFO_MIME_TYPE); // 增加临时路径非空判断 $fileType = !empty($_FILES["imagefile"]["tmp_name"]) ? finfo_file($fileinfo, $_FILES["imagefile"]["tmp_name"]) : ''; finfo_close($fileinfo); // 用完释放资源 if(in_array($fileType, $accepted)) { $targetPath = "images/".$_FILES['imagefile']['name']; if(file_exists($targetPath)) { echo $_FILES['imagefile']['name']." 已经存在"; } else { // 修正两个错误的变量名 if(move_uploaded_file($_FILES['imagefile']['tmp_name'], $targetPath)) { echo "上传成功!"; } else { echo "文件移动失败,请检查images目录权限"; } } } else { echo "允许的文件类型:.png, .jpeg, .jpg, .gif"; } } else { echo "请上传3MB以内的文件!"; } } ?>
步骤3:配置目录权限
Mac XAMPP环境下执行终端命令给images目录加写入权限:chmod 755 /Applications/XAMPP/xamppfiles/htdocs/Year1/Period2/Project/Assignments/WS_FileManagement/images
内容的提问来源于stack exchange,提问作者user14579575
相关产品推荐
相关产品推荐

