如何在cakephp3.7中检索通过带有blob列的表单上传到MySQL数据库的图像的字符串形式的名称?

时间:2019-08-02 21:45:35

标签: string blob cakephp-3.7

我正在使用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">&#9733; &#9733; &#9733; &#9733; &#9734;</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)); ?>

1 个答案:

答案 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,让我知道我错过了这个概念。