如何通过从HTML表单发送图像,使用PHP在MySQL中存储图像文件?我只知道MySQL和HTML部分内容。
这是HTML表单:
<form method="post" enctype="multipart/form-data" action="insert_image.php">
<input type="file" name="image" />
<input type="submit" />
</form>
我知道如何连接数据库并存储正常信息,但是如何正确解析数据以将图像文件存储到MySQL BLOB字段?还有我如何从MySQL中显示它?
ps:我使用PDO进行数据库连接。
答案 0 :(得分:5)
<?php
# getting the uploaded image and storing it
if ( isset($_FILES['image']['tmp_name']) ) {
// open mysqli db connection
$mysqli = new mysqli($mysqliHost,$mysqliUsername,$mysqliPassword,$mysqliDatabase);
// get image data
$binary = file_get_contents($_FILES['image']['tmp_name']);
// get mime type
$finfo = new finfo(FILEINFO_MIME);
$type = $finfo->file($_FILES['image']['tmp_name']);
$mime = substr($type, 0, strpos($type, ';'));
$query = "INSERT INTO `images`
(`data`,`mime`,`name`)
VALUES('".$mysqli->real_escape_string($binary)."',
'".$mysqli->real_escape_string($mime)."',
'".$mysqli->real_escape_string($_FILES['image']['name'])."')";
$mysqli->query($query);
}
# viewing the uploaded image
if ( isset($_GET['imageName']) ) {
// open mysqli db connection
$mysqli = new mysqli($mysqliHost,$mysqliUsername,$mysqliPassword,$mysqliDatabase);
// query for the image in the db
$query = "SELECT `data`,`mime` FROM `images` WHERE `name`='".$mysqli->real_escape_string($_GET['imageName'])."'";
$result = $mysql->query($query);
if ( $result->num_rows ) {
// grab the query result from the db select
$assoc = $result->fetch_assoc();
// let the client browser know what type of data you're sending
header('Content-type: '.$assoc['mime']);
// dump the binary data to the browser
echo $assoc['data'];
exit;
} else {
header('HTTP/1.1 404 Not Found');
exit;
}
}
?>
我的脚本不考虑具有相同名称的图像,您可以将其中包含$ _FILES ['image'] ['name']的部分换成另一个具有/为其创建唯一名称的变量,或者使用插入的ID(PRIMARY AUTO_INCREMENT MySQL密钥)。
以下是示例表架构:
CREATE TABLE `images` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`data` longblob NOT NULL,
`mime` varchar(50) NOT NULL,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
答案 1 :(得分:1)
对于您在数据库中存储的任何内容都是一样的:抓取您要存储的字节,并在将它们添加到查询字符串时将其转义。
这就像:
$image = file_get_contents($image_file_name);
$query = "INSERT INTO img SET image = \"".mysqli_real_escape_string($image)."\"";
答案 2 :(得分:1)
最好的做法是,您需要将图像存储在某个文件夹中,并将路径或名称保存在数据库中。
答案 3 :(得分:0)
您实际上可以使用file_get_contents
获取上传的图像文件的原始内容,将其转义,然后将其作为blob存储在数据库中。要显示它,您实际上只需在设置适当的内容类型后回显blob。
但是,我不这样做。相反,我会将图像存储在磁盘上,并将图像文件的位置存储在MySQL中。
答案 4 :(得分:0)
当我创建一个需要这样的东西(this site)的网站时,我将文件存储在文件系统中并将目录添加到数据库中,确保每个jpg都有唯一的文件名。