2017-08-03 222 views
0

所以我设置了一个CRUD上传文件到服务器的根目录,名为'uploads'。 现在,该文件已正确保存在特定文件夹中,并且数据库条目看起来没问题 - 但图像不显示在CRUD的“索引”和“视图”操作中。对此有任何想法?Yii2上传的图像不显示

创建:

public function actionCreate() 
    { 
     $model = new PhotoGalleryCategories(); 

     if ($model->load(Yii::$app->request->post())) { 

      $model->image = UploadedFile::getInstance($model, 'image'); 

      if (Yii::$app->ImageUploadComponent->upload($model)) { 
       Yii::$app->session->setFlash('success', 'Image uploaded. Category added.'); 

       return $this->redirect(['view', 'id' => $model->id]); 
      } else { 
       Yii::$app->session->setFlash('error', 'Proccess could not be successfully completed.'); 

       return $this->render('create', [ 
        'model' => $model 
       ]); 
      } 

     } else { 
      return $this->render('create', [ 
       'model' => $model, 
      ]); 
     } 
    } 

ImageUploadComponent文件:

<?php 

namespace app\components; 

use Yii; 
use yii\base\Component; 
use yii\base\InvalidConfigException; 

class ImageUploadComponent extends Component { 

    public function upload($model) { 

     if ($model->image) { 

      $imageBasePath = dirname(Yii::$app->basePath, 1) . '\uploads\\'; 
      $imageData = 'img' . $model->image->baseName . '.' . $model->image->extension; 

      $time = time(); 

      $model->image->saveAs($imageBasePath . $time . $imageData); 

      $model->image = $imageBasePath . $time . $imageData; 

      if ($model->save(false)) { 
       return true; 
      } else { 
       return false; 
      } 

     } 

    } 

} 

和索引文件的观点:

<?php 

use yii\helpers\Html; 
use yii\grid\GridView; 

/* @var $this yii\web\View */ 
/* @var $searchModel app\modules\admin\models\PhotoGalleryCategoriesSearch */ 
/* @var $dataProvider yii\data\ActiveDataProvider */ 

$this->title = 'Photo Gallery Categories'; 
$this->params['breadcrumbs'][] = $this->title; 
?> 
<div class="photo-gallery-categories-index"> 

    <h1><?= Html::encode($this->title) ?></h1> 
    <?php // echo $this->render('_search', ['model' => $searchModel]); ?> 

    <p> 
     <?= Html::a('Create Photo Gallery Categories', ['create'], ['class' => 'btn btn-success']) ?> 
    </p> 

    <?= GridView::widget([ 
     'dataProvider' => $dataProvider, 
     'filterModel' => $searchModel, 
     'columns' => [ 
      ['class' => 'yii\grid\SerialColumn'], 

      'name', 

      'image' => [ 
       'attribute' => 'image', 
       'value' => 'image', 
       'format' => ['image', ['class' => 'col-md-6']] 
      ], 

      ['class' => 'yii\grid\ActionColumn'], 
     ], 
    ]); ?> 
</div> 

enter image description here

编辑:在开发ŧ ools,我可以看到图像的正确来源。更重要的是,我可以通过在浏览器中复制地址来访问它。 (第一行是从互联网上通过自己的地址拍摄的图像,他们都不会在本地保存。)

+1

我有类似的问题,但认为这是一些特定的网格视图中,在文档是一无所知,但你可以做的是安装卡尔蒂克和使用GridView和DatePicker的它会解决很多未来的问题。 – Alexei

+0

将文件上传到文件夹中? –

回答

0

我发现这个异常:在检查图像源时,我发现Yii预先将baseUrl添加到图像源,尽管它只显示正确的位。所以我手动分配了进入数据库的路径 - 这样图像正确显示。

这是更改后的上传功能。为了测试整个后端,我将它作为一个组件,并且它的工作完美无瑕。

public function upload($model) { 

     /** 
     * If the $model->image field is not empty, proceed to uploading. 
     */ 
     if ($model->image) { 

      /** 
      * Assign current time. 
      */ 
      $time = time(); 

      /** 
      * Create the basePath for the image to be uploaded at @root/uploads. 
      * Create the image name. 
      * Create the database model. 
      */ 
      $imageBasePath = dirname(Yii::$app->basePath, 1) . '\uploads\\'; 
      $imageData = 'img' . $model->image->baseName . '.' . $model->image->extension; 
      $imageDatabaseEntryPath = '../../../uploads/'; 

      $modelImageDatabaseEntry = $imageDatabaseEntryPath . $time . $imageData; 

      $model->image->saveAs($imageBasePath . $time . $imageData); 

      $model->image = $modelImageDatabaseEntry; 

      /** 
      * If the model can be saved into the database, return true; else return false. 
      * Further handling will be done in the controller. 
      */ 
      if ($model->save(false)) { 
       return true; 
      } else { 
       return false; 
      } 

     } 

    } 

} 
0

如果在文件夹中的图片上传

您查看下面的代码在GridView控件与自己的路:

[ 
       'attribute' => 'image', 
       'format' => 'html', 
       'value' => function($data) { 
        if (empty($data['image'])) { 
         $img = 'default.jpg'; 
        } else { 
         $img = $data['image']; 
        } 


        if (file_exists(\Yii::$app->basePath . \Yii::$app->params['path']['product'] . $img)) { 
         if (file_exists(\Yii::$app->basePath . \Yii::$app->params['path']['product'] . "t-" . $img)) { 
          $path = \Yii::$app->params['path']['webproduct'] . "t-" . $img; 
         } else { 
          $path = \Yii::$app->params['path']['webproduct'] . $img; 
         } 
        } else { 
         if (file_exists(\Yii::$app->basePath . \Yii::$app->params['path']['product'] . "t-default.jpg")) { 
          $path = \Yii::$app->params['path']['webproduct'] . "t-default.jpg"; 
         } else { 
          $path = \Yii::$app->params['path']['webproduct'] . "default.jpg"; 
         } 
        } 

        return Html::img($path, ['width' => '100px', 'height' => '100px']); 
       }, 
        ], 
在params.php

\的Yii :: $ APP-> PARAMS [ '路径'] [ 'webproduct']:

'product' => '/web/uploads/product/', 
     'webproduct' => '/uploads/product/', 

注意:我使用基本模板。