You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过表单上传图片到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 14:48:01