【问题标题】:Importing Blob images from a data base [duplicate]从数据库导入 Blob 图像 [重复]
【发布时间】:2016-10-09 10:04:30
【问题描述】:

所以,我必须从我的数据库中导入图像,并且我已经尝试了所有可能的选项,图像是由用户上传的,所以我不控制文件的扩展名。哦,是的,图片必须出现在一个列表中,每篇文章一张图片,所以我的代码在一个小圈子里。好吧,我认为是数据库配置问题,或者可能是我上传图像的方式,因为它已经 3 个小时了,我无法解决这个问题!

这里是上传代码:

$imageName = addslashes($_FILES['imagen1']['name']);
$imageTempName =  $_FILES['imagen1']['tmp_name'];
$imageBlob = addslashes(file_get_contents($_FILES['imagen1']['tmp_name']) );
$imageType=pathinfo($imageName, PATHINFO_EXTENSION);

$permit=array("jpg", "tif", "gif", "png", "raw", "jpeg", "bmp");

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=lacajota', 'root', '', $pdo_options);

$req = $bdd->prepare('INSERT INTO imagenes(userID, articID, name, image)
       VALUES(:userID, :articID, :name, :image)');
$req->execute(array(

            'userID'=> $_SESSION['userID'],
            'articID'=> $LastArtLast['ID'],
            'name'=> $imageName,
            'image'=> $imageBlob
            ));

我跳过了一些不重要的行

这是提取图像的代码:

第 1 步简单的图片链接(这是在一个圆环中)

<img src="getImage.php?id=<?php echo  $userInfoLastART1['ID'];?>" class="imageArtList">

第 2 步使 getImage.php 成为我的图像

 $id = $_GET['id'];


 $link = mysql_connect("localhost", "root", "");
  mysql_select_db("imagenes");

$sql = "SELECT * FROM imagenes WHERE articID=$id";
$result = mysql_query("$sql");
$row = mysql_fetch_assoc($result);

mysql_close($link);

header("Content-type: image/jpg");
  echo $row['image'];

这就是我重复的全部内容,这不是重复的问题!

非常感谢您有愉快的一天!

【问题讨论】:

  • 我从您的标题中删除(尚未解决)。没有看到公认的答案,那就是;未解决。所以等待解决方案。
  • (a) 这里的问题是,您使用的是 PDO 和 mysql_,您不能将这些不同的 API 混合在一起。
  • 你的意思是当我在数据库中插入图像时?第一个代码块?
  • 因为 Blob 已在我的数据库中注册
  • @Boris 你为什么要做mysql_select_db("imagenes")? “imagenes”不是表名吗?

标签: php mysql sql database image


【解决方案1】:

图像的文件内容必须以二进制形式处理,不得修改。

我假设您的 addslashes() 函数是试图转义特殊字符并防止 sql 注入。不幸的是,这几乎肯定会搞砸您的图像块(Binary Large OBject)。

这一行,很可能会改变二进制文件。

$imageBlob = addslashes(file_get_contents($_FILES['imagen1']['tmp_name']) );

此外,您的 PDO::Execute() 调用没有为 BLOB 的二进制数据指定正确的类型。

重要提示

  • 如果您正确使用 PDO,PDO 将为您处理此问题。
    • 您当前所做的应该足够了,但您需要告诉 PDO 将图像作为二进制处理。
    • 如果您还将代码用于getImage.php,您可能会发现代码更易于管理。

解决方案

$imageName      = addslashes($_FILES['imagen1']['name']);
$imageTempName  = $_FILES['imagen1']['tmp_name'];
//$imageBlob        = file_get_contents( imageTempName );
$imageBlob      = fopen($imageTempName , 'rb');

$imageType=pathinfo($imageName, PATHINFO_EXTENSION);

$permit=array("jpg", "tif", "gif", "png", "raw", "jpeg", "bmp");

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=lacajota', 'root', '', $pdo_options);

$req = $bdd->prepare('
    INSERT INTO imagenes
        (userID, articID, name, image)
    VALUES
        (:userID, :articID, :name, :image)'
);

$req->bindParam(':userID', $_SESSION['userID'], PDO::PARAM_INT);
$req->bindParam(':articID', $LastArtLast['ID'], PDO::PARAM_INT);
$req->bindParam(':name', $imageName, PDO::PARAM_STR);
$req->bindParam(':image', $imageBlob, PDO::PARAM_LOB);

$req->execute();

【讨论】:

  • 不错的发现,我错过了这个
  • 我已经上传了我的代码让我运行它
  • 感谢您的大而有趣的回答,但不...不工作
  • 那么您处理图像文件本身的方式不是二进制的。您是否尝试过访问本地文件 $_FILES['imagen1']['tmp_name'] 以确保图像在那个阶段是好的?
  • 检查完后,尝试将$row['image']; 写入本地文件的内容,然后检查。
【解决方案2】:

是的

header("Content-Type: image/jpeg");

而不是

header("Content-type: image/jpg");

【讨论】:

  • 也许可以,但这并不能解决问题,谢谢
  • header("Content-Type: image/jpeg"); 是有效的php.net/manual/en/function.imagejpeg.php - 唯一的事情,type 应该是大写的 T。“可能”是一个问题,但有点怀疑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2013-06-26
相关资源
最近更新 更多