[英]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));
准備好的語句(使用mysqli或PDO )語句將防止SQL注入,這使得不必要使用addslashes()
。
筆記:
<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.