如何通过表单上传图片到MySQL数据库的blob类型字段
HTML代码修正
你现有代码存在语法错误:所有输入框、换行标签都错误嵌套在了<select>标签内部,修正后的代码如下:
<!-- 修正后的表单代码 --> <form action="" method="post" enctype="multipart/form-data"> <h1>Service Name: </h1> <select name="serviceNamesForm"> <?php require_once 'includes/dbh-inc.php'; $sql = "SELECT serviceName FROM addService;"; $result = $conn->query($sql); while ($row = $result->fetch_assoc()) { $service_name = $row['serviceName']; echo "<option value='$service_name'>$service_name</option>"; } ?> </select> <br><br> <input type="text" name="product" placeholder="Product Name..."> <br><br> <!-- 加accept限制仅可选图片文件 --> <input type="file" name="productImage" accept="image/*"> <br><br> <!-- 加name属性方便后端识别提交动作 --> <input type="submit" value="Submit" name="submitBtn"> </form>
后端上传逻辑实现
推荐使用「图片存服务器本地目录、路径存数据库」的方案,性能远高于直接存二进制图片到数据库。
将以下PHP代码写在页面最顶部即可:
<?php require_once 'includes/dbh-inc.php'; // 检测表单是否提交 if (isset($_POST['submitBtn'])) { $serviceName = $_POST['serviceNamesForm']; $productName = $_POST['product']; // 提前在项目根目录创建uploads文件夹,设置权限为755 $uploadDir = 'uploads/'; // 检测文件上传是否出错 if ($_FILES['productImage']['error'] === UPLOAD_ERR_OK) { // 校验文件类型为合法图片 $fileMimeType = mime_content_type($_FILES['productImage']['tmp_name']); $allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; if (!in_array($fileMimeType, $allowedMimeTypes)) { echo "仅支持上传jpg、png、gif、webp格式的图片"; exit; } // 生成唯一文件名,避免重名覆盖 $fileExt = pathinfo($_FILES['productImage']['name'], PATHINFO_EXTENSION); $saveFileName = uniqid() . '.' . $fileExt; $savePath = $uploadDir . $saveFileName; // 将临时文件移动到正式上传目录 if (move_uploaded_file($_FILES['productImage']['tmp_name'], $savePath)) { // 插入数据到数据库,将下方表名、字段名替换为你自己的实际配置 $insertSql = "INSERT INTO 你的业务表名 (serviceName, productName, productImgPath) VALUES (?, ?, ?)"; $stmt = $conn->prepare($insertSql); // 三个s对应三个字符串类型参数,按你的实际字段类型调整即可 $stmt->bind_param("sss", $serviceName, $productName, $savePath); if ($stmt->execute()) { echo "数据提交成功"; } else { echo "数据库写入失败:" . $conn->error; } $stmt->close(); } else { echo "文件保存失败,请检查uploads目录权限"; } } else { echo "图片上传出错,错误码:" . $_FILES['productImage']['error']; } } ?>
注意事项
- 若确实需要直接存储二进制图片到数据库,将上述存路径的逻辑替换为读取临时文件内容,存入对应BLOB类型字段即可,该方案会大幅提升数据库体积、降低查询效率,不推荐使用
- 生产环境建议额外增加文件大小限制、文件名恶意字符过滤、上传文件二次校验等逻辑,规避恶意文件上传风险
内容的提问来源于stack exchange,提问作者xSmiiB
相关产品推荐
相关产品推荐

