3

如何通过从 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 进行数据库连接。

4

5 回答 5

6
<?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 ;
于 2013-03-28T00:34:57.370 回答
1

对于您存储在数据库中的任何内容,它都是相同的:获取您想要存储的字节并在将它们添加到查询字符串时对其进行转义。

这就像:

$image = file_get_contents($image_file_name);
$query = "INSERT INTO img SET image = \"".mysqli_real_escape_string($image)."\"";
于 2013-03-28T00:10:21.440 回答
1

实际上,最佳实践表明您需要将图像存储在某个文件夹中并将路径或名称保存在数据库中。

这可以帮助你: http ://www.htmlgoodies.com/beyond/php/article.php/3877766/Web-Developer-How-To-Upload-Images-Using-PHP.htm

从 PHP URL 保存图像

于 2013-03-28T00:12:34.930 回答
0

您实际上可以使用 获取上传图像文件的原始内容,对其进行file_get_contents转义,然后将其作为 blob 存储在数据库中。要显示它,您实际上可以在设置适当的内容类型后回显 blob。

但是,我不会那样做。相反,我会将图像存储在磁盘上并将图像文件的位置存储在 MySQL 中。

于 2013-03-28T00:12:19.287 回答
0

就我个人而言,当我创建一个需要这样的站点(这个站点)时,我将文件存储在文件系统中并将目录添加到数据库中,确保每个 jpg 都有一个唯一的文件名。

于 2013-03-28T00:18:49.473 回答