簡體   English   中英

MYSQL數據庫中的圖像上傳不起作用

[英]Image Upload in MYSQL Database not working

我已經閱讀了許多關於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==">

互聯網上的所有文章都顯示了該解決方案,但是為什么它最終無法正常工作?

您需要將圖像另存為base64_encode在數據庫中。 上載時,將您的代碼更改為下一行:

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

當需要顯示圖像時,只需要放置內容即可。 無需再次編碼。 如下:

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

希望對您有幫助。

在嘗試@dnFer的建議后,我嘗試在顯示圖像時使用反斜杠。 一切正常。

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

但是我有一個問題。 我在某個地方讀到: “在閱讀本文時,我看到了問題是stripslashes()。由於數據是二進制的,因此它可能包含等於斜杠的任意字符,因此它將刪除它們。”

這會是一個問題嗎? 去除斜線后,我的數據仍然安全嗎?

簡短答案:

更改

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

$imgContent = file_get_contents($image);

長答案:

當應用addslashes() ,當圖像的二進制數據包含一個或多個單引號('),雙引號(“),反斜杠(\\)或NUL(NUL字節)時,其二進制數據將更改。它將在這些字符之前添加反斜杠。

這樣做是為了避免在准備好的語句不存在或很少使用的時候進行SQL注入 例如:

$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%。
  • 最好將映像存儲在文件服務器而不是數據庫上,因為存儲大量數據會降低數據庫服務器的速度。
<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);
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM