How can I store a image file in MySQL with PHP by sending the image from a HTML form? I only know the MySQL and HTML part of the stuff.
Here's the HTML form:
<form method="post" enctype="multipart/form-data" action="insert_image.php">
<input type="file" name="image" />
<input type="submit" />
</form>
I know how to connect to the database and store normal information, but how can I parse the data correctly to store the image file to a MySQL BLOB field? And also how can I display it from MySQL?
ps: Im using PDO to do the database connections.
<?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;
}
}
?>
My script does not account for images with the same name, you can swap out the part where it says $_FILES['image']['name'] to another variable that has/creates a unique name for it, or use the inserted ID (PRIMARY AUTO_INCREMENT MySQL key).
Here is a sample table schema:
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 ;
Its the same for anything you store in the database: Grab the bytes you want to store and escape them when adding them to the query string.
This is like:
$image = file_get_contents($image_file_name);
$query = "INSERT INTO img SET image = \"".mysqli_real_escape_string($image)."\"";
Really the best practices says than you need store the image in some folder and save the path or the name in the database.
this could help you: http://www.htmlgoodies.com/beyond/php/article.php/3877766/Web-Developer-How-To-Upload-Images-Using-PHP.htm
You can actually get the raw contents of the uploaded image file with file_get_contents
, escape it, and then store it in the DB as a blob. To display it you can actually just echo out the blob after setting the appropriate content-type.
However, I wouldn't do it that way. Instead I would store the image on the disk and store the location of the image file in MySQL.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.