我正在使用cakephp3.7构建一个电子商务网站,对于卖家要发布其产品,他们需要上传商品图片并通过带有Blob列的表格上传。从视图可以很好地上传图像,但是在数据库中,图像的真实名称并未出现,而是在其中显示了所有图像的名称为“ Blob”。现在的问题是,当我尝试从数据库到控制器中检索文章的图像(只能通过其名称来获知)以便将其发送到网站的前端时,找不到图像,并且我严重卡住!!!
但是,当我进入webroot / img文件夹时,我会找到上载的图像,并且在前端视图中手动复制/粘贴名称时,该图像将与文章的其他属性一起显示在前端。
这是应该从数据库中找到文章及其图像的控制器代码,地址表是表“ annonces”,表中存储图像的字段是“ piece_jointe”:>
public function articles()
{
$this->viewBuilder()->layout('react2019');
$annonces = $this->Annonces->find()
->where(['Annonces.subcategorie_id'=>1])
->contain(['Comptes', 'Subcategories'])
->all();
$this->set(compact('annonces'));
}
这是将发布的文章转发到前端时的文章视图,我现在不能检索的字段是“ piece_jointe”:
<?php foreach ($annonces as $annonce): ?>
<div class="col-lg-4 col-md-6 mb-4">
<div class="card h-100">
<a href="#"><?= $this->Html->image($annonce->piece_jointe, array('height'=>90, 'width'=>90)); ?></a>
<div class="card-body">
<h4 class="card-title">
<a href="#"><?= h($annonce->annonce_titre) ?></a>
</h4>
<h5><?= h($annonce->prix_produit) ?></h5>
<p class="card-text"><?= h($annonce->annonce_description) ?></p>
</div>
<div class="card-footer">
<small class="text-muted">★ ★ ★ ★ ☆</small>
</div>
</div>
</div>
<?php endforeach; ?>
我想知道从mysql数据库检索Blob类型'piece_jointe'的名称并将其用于cakephp语法的方法:
<?= $this->Html->image($annonce->piece_jointe, array('height'=>90, '
width'=>90)); ?>
因为当我将$ annonce-> piece_jointe变量替换为它的真实名称“ macbook”时,这可以很好地工作:
<?= $this->Html->image('macbook', array('height'=>90, 'width'=>90)); ?>
答案 0 :(得分:0)
到目前为止一切顺利!我深入研究了Cakephp关于处理图像,视频,pdf,docs等文件的约定。,并且我了解了更多。首先,我认为我应该将图像作为BLOB存储在数据库中,以便遵守MVC概念。但我最终发现,cakephp通常可以有效地处理图像和文件,因为图像和文件是明智的信息,它们会在应用程序中造成漏洞,cakephp建议不要将图像直接存储在数据库中,以防止诸如< strong> SQL注入。许多人提出了有关如何处理cakephp中图像的问题,但是给出的答案并不完全适用。因此,我想通过以下四个步骤来介绍要点: 1-当我们上传文件时,就像我在'piece_jointe'列中所做的那样,我将其类型从'BLOB'更改为'VARCHAR',cakephp为该图像提供了参数如您从我的debug($ this-> request-> data)的渲染图所见:
[
'title' => 'computer',
'category_id' => '1',
'subcategory_id' => '3',
'announce_description' => 'smart price',
'prix_produit' => '500000',
'photo'=> '',
'compte_id' => '1',
'piece_jointe' => [
'tmp_name' => '/private/var/folders/kl/lgxkfn5x4r1fjht2wckngjzr0000gn/T/phpodWgh1',
'error' => (int) 0,
'name' => 'macbook.jpg',
'type' => 'image/jpeg',
'size' => (int) 37780
]
]
您可以看到'piece_jointe'具有cakephp创建的诸如'temp_name','error','name','type','size'之类的字段,以便我们自定义图像和文件上载。 但是,我们在这些信息中确实需要的是“名称”。因此,我们将向数据库中宣布的表中添加另一个varchar列,这就是为什么我添加了带有varchar类型的“ photo”列的原因,您可以在上面的调试结果中看到该列。目的是在我们的控制器中为图像的路径$ uploadPath = WWW_ROOT.'img / products /'及其名称$ fileName = $ this-> request-> data ['piece_jointe'] ['name']提供“照片” add()方法 因此cakephp可能会遵循该路径,并从相关的文件夹中获取图像,在我的案例中,该文件夹是webroot / img中的产品文件夹。总体操作如下所示:
if (!empty ($this->request->data['piece_jointe']['tmp_name']))
{
$fileName = $this->request->data['piece_jointe']['name'];
$uploadPath = WWW_ROOT.'img/products/';
$uploadFile = $uploadPath.$fileName;
if (move_uploaded_File($this->request->data['piece_jointe']['tmp_name'], $uploadFile))
{
$annonce->photo = 'products/'.$fileName;
}
}
2-然后在Model / Table中不要忘记将其添加到公共函数initialize(array $ config)方法中:
$ this-> addBehavior('Timestamp');
另一件事也不要忘记在add()视图中提及将“ piece_jointe”为“ type” =>“ file”的图像上传到何处。 您可能会这样:
<?php
echo $this->Form->input('piece_jointe', [ 'type' => 'file']);
?>
</Div>
3-最后,当我发疯时,“照片”列在数据库/products/macbook.jpg中而不是在“ BLOB”中接收到此值。 4-要检索图像,我们只需将其添加到视图中即可:
<?= $this->Html->image($annonce->photo, array('height'=>90, 'width'=>90)); ?>
总而言之,这些是处理cakephp中上传的图像和文件的可靠步骤。将图像存储到具有BLOB类型的数据库中,并希望将其显示在前端时,会产生原始的MVC概念,这实在太麻烦了。 同样感谢@ndm,让我知道我错过了这个概念。