我已经阅读了许多关于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上的所有文章都显示了此解决方案,但是为什么它在我最后没有用?
答案 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));
准备好的语句(使用mysqli或PDO)语句将阻止SQL注入,从而无需使用addslashes()
。
注释:
答案 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);
?>