【问题标题】:Image Upload in MYSQL Database not workingMYSQL 数据库中的图像上传不起作用
【发布时间】:2019-07-10 09:43:50
【问题描述】:

我已经阅读了大量关于 stackoverflow 和 google 的关于文件上传和直接在/从 MYSQL BLOB 列中显示的文章。我不需要在任何地方上传文件,因为我的整个项目只涉及一个文件,那就是用户要更新的徽标文件。 虽然我想用 Codeigniter Upload 库来做这些事情,但我无法完成代码,所以我尝试了简单的 PHP 解决方案,但它也没有奏效。

下面是我的代码。

上传表单代码:

<?php echo form_open_multipart('UpdateCompanyInfo'); ?>
        <div class="form-group">
            <label>Logo</label>
            <input type="file" class="form-control" name="logo">
            [200 px (width)x200px (height)]
        </div>
    <div class="box-footer">
        <button type="submit" class="btn btn-primary">Update Logo</button>
    </div>
<?php echo form_close(); ?>

上传代码:

$check = getimagesize($_FILES["logo"]["tmp_name"]);
if($check !== false)
 {
    if($check[0]=="200" && $check[1]=="200" )
    {
        $image = $_FILES['logo']['tmp_name'];
        $imageFileType = strtolower(pathinfo($_FILES['logo']['name'],PATHINFO_EXTENSION));
        if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg") {
            return '<div class="alert alert-danger">'.$imageFileType.' Logo file of only jpg/png/jpeg type is acceptable.</div>';
        }
        $imgContent = addslashes(file_get_contents($image));
        if($this->db->update("company", array('logo'=>$imgContent)))
        {
            return '<div class="alert alert-success">Logo has been updated successfully.</div>';
        }
        else
        {
            return '<div class="alert alert-danger">Error 101. Failed to update the logo.</div>';
        }
    }
    else
        return '<div class="alert alert-danger">Logo file of only 200px X 200px is acceptable.</div>';
}

在视图中显示图像的代码

echo '<img src="data:image/png;base64,'.base64_encode($companyinfo[0]->logo).'"/>';

我上传的是png文件,所以我使用了data:image/png

检查视图中的图像元素时,我得到以下输出:

<img src="data:image/png;base64,iVBORw0KGgpcMFwwXDAN ....... v6/IDhCwtLWDE56vdo6CwCC07dMeva1dhgIGnEBikg7xODG0Pq+m61z8bC4Vqpzxpq6d8BhQK7Q1+rte/oyhK61mIAoGRznxWpiYmb8jaleunKEotrSaXy1Xb1lnxXhXvSAGgKtXBetZJOQEAIQkBAQAhCQEAIQkBACEJA8P7xP2GoiDrA7B2BXDBcMFwwXDBJRU5ErkJggg==">

互联网上的所有文章都显示了这个解决方案,但为什么它在我的最后不起作用?

【问题讨论】:

  • 我只是在猜测,因为我从未将图像存储到数据库中,但是如果您将addslashes() 应用于图像的内容,数据不会因为图像数据而损坏因为你改变了它?
  • PHP 或 MySQL 是否返回任何错误?
  • @SpacePhoenix 只是一个图标,在图像未渲染时出现在浏览器中。
  • @dnFer 我从标记的答案中得到了解决方案并使用了它,stackoverflow.com/questions/17717506/…
  • @dnFer 我看到 addlashes() 无处不在,但你的假设有效。删除 addlashes() 时显示徽标

标签: php mysql image file-upload blob


【解决方案1】:

您需要将图像保存为数据库中的 base64_encode。上传时将代码更改为以下行:

$imgContent = base64_encode(file_get_contents($image));

当你需要展示图片时,你只需要放内容。无需再次编码。如下:

echo '<img src="data:image/png;base64,'.$companyinfo[0]->logo.'"/>';

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    在尝试了@dnFer 的建议后,我尝试在显示图像时使用stripslashes。一切正常。

     echo '<img src="data:image/png;base64,'.base64_encode(stripslashes($companyinfo[0]->logo)).'"/>';
    

    但我有一个问题。我在某处读到:“当我阅读这篇文章时,我看到问题是 stripslashes()。由于数据是二进制的,它可能包含等于斜杠的任意字符,因此它将删除它们。” p>

    这会是个问题吗?去掉斜线后我的数据还安全吗?

    【讨论】:

      【解决方案3】:

      简答:

      改变

      $imgContent = addslashes(file_get_contents($image));
      

      $imgContent = file_get_contents($image);
      

      长答案:

      应用addslashes()时,图片的二进制数据在包含一个或多个单引号(')、双引号(")、反斜杠(\)或NUL(NUL字节)时发生变化。它添加了一个反斜杠在那些字符之前。

      这可能是为了避免 SQL injection 在准备好的语句不存在或很少使用的时候。 例如:

      $imgContent = addslashes(file_get_contents($image));
      $query = mysql_query ("insert into imageTable values ("INSERT INTO `product_images` (`id`, `image`, `image_name`) VALUES ('1', '{$imgContent}', '{$image_name}')"));
      
      //Do Stuff like reading the image date from the database...
      
      $imgContent = stripslashes($imgContent);
      echo '<img src="data:image/png;base64,' . base64_encode($imgContent) . '"/>';
      

      如今,不使用准备好的语句是不好的做法,我怀疑您的数据库库也在以下行中使用了它:

      $this->db->update("company", array('logo'=>$imgContent));
      

      准备好的语句(使用mysqliPDO)语句将防止SQL注入,这使得addslashes()的使用变得不必要。

      注意事项:

      • 确保您的数据库数据字段足够大(TINYBLOB、BLOB、 MEDIUMBLOB 和 LONGBLOB) 以包含完整的图像(数据)。
      • 不要将base64编码的图像数据作为此数据存储在数据库中 比二进制数据大 30% 左右。
      • 更喜欢将图像存储在文件服务器而不是数据库上,因为存储大量数据会降低数据库服务器的速度。

      【讨论】:

      • 还是和第三个代码块一样:echo '&lt;img src="data:image/png;base64 etc...
      • 但问题是无论我使用什么方法,logo 都在网页中可见,但在通过 mpdf 库创建的 pdf 中不可见
      • 主题是关于将图像数据存储到数据库中并使用 html img 标签显示它。与 mpdf 库无关。这个问题得到了回答,因为图像确实显示在网页中。对于有关 mpdf 库的问题,您应该提出一个新问题。
      【解决方案4】:
      <form action="upload.php" method="POST" enctype="multipart/form-data">
      <input type="file" name="image">
      </form>
      

      php代码上传.php

      <?php
      include_once 'dbconn.php';
      $image = $_FILE['image'];
      $name = $image['name'];
      $tmpname = $image['tmp_name'];
      $imgdestination = '../img/'.$name;
      move_uploaded_file($tmpname, $imgdestination);
      ?>
      

      【讨论】:

      • 请仔细阅读说明。我已经提到我不需要上传文件,我只需要将它保存在数据库中。
      • 你必须在数据库中保存什么?
      • BLOB 字段中的图像
      猜你喜欢
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2016-05-06
      • 2014-05-11
      • 1970-01-01
      • 2016-05-26
      相关资源
      最近更新 更多