php实现插入图片
插入图片到数据库
使用PHP将图片插入数据库通常涉及将图片转换为二进制数据(BLOB)存储。以下是一个完整示例:
<?php
// 数据库连接配置
$host = 'localhost';
$dbname = 'your_database';
$username = 'your_username';
$password = 'your_password';
try {
$conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 获取上传的图片文件
$image = file_get_contents($_FILES['image']['tmp_name']);
// 准备SQL语句
$stmt = $conn->prepare("INSERT INTO images (image_data, image_name) VALUES (?, ?)");
// 绑定参数并执行
$stmt->bindParam(1, $image, PDO::PARAM_LOB);
$stmt->bindParam(2, $_FILES['image']['name']);
$stmt->execute();
echo "图片上传成功";
} catch(PDOException $e) {
echo "错误: " . $e->getMessage();
}
$conn = null;
?>
存储图片到文件系统
更常见的做法是将图片存储在服务器文件系统中,数据库中只保存路径:
<?php
// 上传目录
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["image"]["name"]);
// 检查是否为真实图片
$check = getimagesize($_FILES["image"]["tmp_name"]);
if($check === false) {
die("文件不是图片");
}
// 检查文件大小(限制为5MB)
if ($_FILES["image"]["size"] > 5000000) {
die("文件太大");
}
// 允许特定文件格式
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg") {
die("只允许JPG, JPEG, PNG格式");
}
// 尝试上传文件
if (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) {
// 将路径存入数据库
$stmt = $conn->prepare("INSERT INTO images (image_path) VALUES (?)");
$stmt->execute([$target_file]);
echo "图片上传成功";
} else {
echo "上传失败";
}
?>
显示存储的图片
从数据库显示BLOB图片:
<?php
$stmt = $conn->prepare("SELECT image_data FROM images WHERE id = ?");
$stmt->execute([$image_id]);
$image = $stmt->fetch(PDO::FETCH_ASSOC);
header("Content-Type: image/jpeg");
echo $image['image_data'];
?>
显示文件系统中的图片:
<?php
$stmt = $conn->prepare("SELECT image_path FROM images WHERE id = ?");
$stmt->execute([$image_id]);
$image = $stmt->fetch(PDO::FETCH_ASSOC);
echo '<img src="'.$image['image_path'].'" alt="存储的图片">';
?>
安全注意事项
验证文件类型时应使用服务器端检查,而非仅依赖客户端检查:
$allowed_types = ['image/jpeg', 'image/png'];
$detected_type = mime_content_type($_FILES['image']['tmp_name']);
if(!in_array($detected_type, $allowed_types)) {
die("不允许的文件类型");
}
为上传文件生成唯一文件名,避免覆盖和安全问题:
$new_filename = uniqid().'.'.$imageFileType;
$target_file = $target_dir . $new_filename;
设置上传目录权限为不可执行:
chmod -R 755 uploads/






