PHP如何实现表单上传的图片保存到指定目录并存入数据库
PHP表单图片上传功能修复方案
原有代码核心问题
- 前端表单未设置
enctype="multipart/form-data"属性,默认表单编码格式不支持文件传输,导致后端无法正确接收上传的图片 - 后端错误使用
$_POST读取文件参数,上传的文件信息需要通过PHP超全局变量$_FILES获取 - 直接拼接SQL语句存在SQL注入风险,生产环境必须使用预处理语句操作数据库
- 没有上传结果校验、文件类型校验、目标目录权限校验,容错性极低
- 未处理文件重名问题,相同文件名的图片会被直接覆盖
修复后代码
前端HTML代码
<html> <head> </head> <!-- 添加上传文件必须的enctype属性 --> <form method="post" action="IConductores.php" enctype="multipart/form-data"> <p></p> <!-- 如果你需要传Rfc参数,记得在这里加对应的input输入框,比如: <label>RFC</label> <input type="text" id="Rfc" name="Rfc" required> --> <label>Foto</label> <input type="file" id="Foto" name="Foto" accept="image/*" required> <input type="submit" id="Enviar" name="Enviar"> </form> </html>
后端IConductores.php代码
<?php // 先判断是否有文件上传且无错误 if (!isset($_FILES['Foto']) || $_FILES['Foto']['error'] !== UPLOAD_ERR_OK) { die("图片上传失败,请检查文件大小、格式是否符合要求"); } // 1. 读取参数 $Rfc = $_POST['Rfc'] ?? ''; // 读取上传文件的信息 $uploadFile = $_FILES['Foto']; $tmpPath = $uploadFile['tmp_name']; // 上传后的临时文件路径 $originName = $uploadFile['name']; // 原文件名 $fileSize = $uploadFile['size']; $fileExt = pathinfo($originName, PATHINFO_EXTENSION); // 获取文件后缀 // 2. 校验文件合法性 $allowExt = ['jpg', 'jpeg', 'png', 'gif']; // 允许的图片后缀 if (!in_array(strtolower($fileExt), $allowExt)) { die("仅允许上传jpg、png、gif格式的图片"); } // 限制文件大小不超过2M,可自行调整 if ($fileSize > 2 * 1024 * 1024) { die("图片大小不能超过2M"); } // 3. 准备保存路径 $destDir = 'ImagenesPerfil/'; // 如果目标目录不存在则创建,设置权限为755 if (!file_exists($destDir)) { mkdir($destDir, 0755, true); } // 生成新的文件名避免重名,这里用时间戳+随机数+原后缀,也可以用Rfc作为文件名前缀 $newFileName = time() . '_' . mt_rand(1000, 9999) . '.' . $fileExt; $destPath = $destDir . $newFileName; // 4. 移动临时文件到目标目录 if (!move_uploaded_file($tmpPath, $destPath)) { die("图片保存失败,请检查" . $destDir . "目录的写入权限"); } // 5. 写入数据库,这里用PDO预处理示例,避免SQL注入,你也可以用mysqli的预处理 // 以下是示例代码,需要替换成你自己的数据库连接信息 $host = '你的数据库地址'; $dbname = '你的数据库名'; $username = '数据库用户名'; $password = '数据库密码'; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 预处理SQL,绑定参数 $stmt = $pdo->prepare("INSERT INTO Conductores (Rfc, Foto) VALUES (?, ?)"); $stmt->execute([$Rfc, $destPath]); // 把图片的保存路径存入数据库,后续生成PDF直接读取这个路径即可 } catch (PDOException $e) { die("数据库写入失败:" . $e->getMessage()); } echo "上传成功,图片路径已存入数据库"; ?>
额外注意事项
- 后续生成PDF时,直接从数据库读取Foto字段存的图片路径,调用对应PDF类库的图片插入方法即可
- 如果不需要保留原文件名,也可以直接用Rfc作为文件名,方便后续关联查询
- 生产环境建议进一步做文件内容校验,避免恶意文件伪装成图片上传
内容的提问来源于stack exchange,提问作者Oscar Navarro
相关产品推荐
相关产品推荐

