PHP上传图片时MySQL数据库mediumblob类型BLOB数据写入失败问题
问题根因
- 核心原因是
mysqli预处理语句绑定b类型二进制参数时,不支持直接将二进制内容作为变量传入,需要调用专用方法发送数据,直接绑定会导致二进制数据被截断或识别为空 - 次要可能原因:
- MySQL服务端
max_allowed_packet配置值小于实际上传文件大小,触发数据包大小限制导致二进制内容写入被丢弃 - 数据库连接未正确设置字符集,二进制内容被字符转义逻辑破坏
- 上传文件本身存在异常(比如临时文件读取失败)未被捕获
- MySQL服务端
解决方案
1. 修改BLOB参数绑定逻辑(优先操作)
按照mysqli二进制数据写入规范调整代码,使用send_long_data方法发送BLOB内容,代码示例如下:
if(isset($_POST['file_one_submit'])){ $post = 'file_one_input'; // 先校验上传是否正常 if ($_FILES[$post]['error'] !== UPLOAD_ERR_OK) { die("上传失败,错误码:".$_FILES[$post]['error']); } $file = file_get_contents($_FILES[$post]['tmp_name']); $name = $_FILES[$post]['name']; $size = $_FILES[$post]['size']; $format = pathinfo($name, PATHINFO_EXTENSION); // 预处理语句 $stmt = $conn -> prepare("REPLACE INTO `images` (id, name, size, format, file) VALUES(?, ?, ?, ?, ?);"); // 绑定参数时BLOB位置传入null占位 $stmt -> bind_param("isisb", $id, $name, $size, $format, $null); // 索引从0开始计数,第5个参数对应索引为4,传入二进制内容 $stmt->send_long_data(4, $file); $stmt -> execute(); }
2. 调整MySQL数据包大小限制
修改MySQL配置文件my.cnf(Windows下为my.ini),添加或修改以下配置:
max_allowed_packet = 32M
修改后重启MySQL服务生效,配置值需大于你允许上传的最大图片大小。
3. 校验数据库连接字符集
在初始化数据库连接后,添加字符集设置代码,避免转义逻辑异常:
$conn = new mysqli($host, $user, $pwd, $dbname); // 连接成功后设置字符集 $conn->set_charset('utf8mb4');
内容的提问来源于stack exchange,提问作者541daw35d
相关产品推荐
相关产品推荐

