MYSQL数据库中的图像上传不起作用

时间:2019-02-16 12:22:09

标签: php mysql image file-upload blob

我已经阅读了许多关于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==">

Internet上的所有文章都显示了此解决方案,但是为什么它在我最后没有用?

4 个答案:

答案 0 :(得分:0)

您需要在数据库中将图像另存为base64_encode。上载时,更改代码如下行:

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

,当您需要显示图像时,只需要放置内容即可。无需再次编码。如下:

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

希望它对您有帮助。

答案 1 :(得分:0)

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

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

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

这会有问题吗?除去斜线后,我的数据仍然安全吗?

答案 2 :(得分:0)

简短答案:

更改

$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%。
  • 最好将图像存储在文件服务器而不是数据库上,因为存储大量数据会降低数据库服务器的速度。

答案 3 :(得分:-2)

<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="file" name="image">
</form>

Php代码upload.php

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