2014-12-23 3 views
2

ПриветYii2 Показать изображение хранится в поле базы данных BLOB

мне нужно отображать изображения, хранящиеся в полях базы данных BLOB в виде списка или аналогичный виджет от Yii2

У меня есть actionCreate, сохраняющий изображение в таблице с именем honra как BLOB

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

    if ($model->load(Yii::$app->request->post()) && $model->save()) { 
     $file = UploadedFile::getInstance($model,'binaryfile'); 
     $model->binaryfile=$file; 
     return $this->redirect(['view', 'id' => $model->id]); 
    } else { 
     return $this->render('create', [ 
      'model' => $model, 
     ]); 
    } 
} 

я га ве модели под названием Honra

class Honra extends \yii\db\ActiveRecord{ 

public static function tableName() 
{ 
    return 'honra'; 
} 

/** 
* @inheritdoc 
*/ 
public function rules() 
{ 
    return [ 
     [['nome', 'texto'], 'required'], 
     [['texto', 'binaryfile'], 'string'], 
     [['ativo'], 'integer'], 
     [['nome'], 'string', 'max' => 255], 
     [['fileName'], 'string', 'max' => 100], 
     [['fileType'], 'string', 'max' => 50] 
    ]; 
} 

/** 
* @inheritdoc 
*/ 
public function attributeLabels() 
{ 
    return [ 
     'id' => Yii::t('app', 'ID'), 
     'nome' => Yii::t('app', 'Nome'), 
     'texto' => Yii::t('app', 'Texto'), 
     'fileName' => Yii::t('app', 'File Name'), 
     'fileType' => Yii::t('app', 'File Type'), 
     'binaryfile' => Yii::t('app', 'Binaryfile'), 
     'ativo' => Yii::t('app', 'Ativo'), 
    ]; 
} 

}

Изображения успешно сохраняются в поле таблицы с именем binaryfile

И мне нужно, чтобы отобразить каждый блоб изображение, хранящееся в базе данных в целях названный view2 внутри LISTVIEW или аналогичного виджета

Любой знает, какой блок o f код мне нужно поставить в view2 и HonraController для достижения этого?

EDIT

решаемые

ВОТ КОД, ЧТО РЕШИТЬ ПРОБЛЕМУ ТЕПЕРЬ ВСЕ РАБОТАЕТ ХОРОШО

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

    if (Yii::$app->request->isPost) { 

      $model->file = UploadedFile::getInstance($model, 'file'); 
      $filePath = 'uploadsimg/' . $model->file->baseName . '.' . $model->file->extension; 
      $model->fileName = $filePath; 
      $model->save(); 

      $model->file->saveAs('uploadsimg/' . $model->file->baseName . '.' . $model->file->extension); 
      if ($model->load(Yii::$app->request->post()) && $model->save()) { 
       return $this->redirect(Url::toRoute(['create'])); 
      } 
     } 
     return $this->render('create', ['model' => $model]); 
} 

БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ MIHAI

+0

Ну, вам нужно сделать еще один звонок к действию в контроллере, который даст вам изображение. То есть для каждого изображения в списке. Вы не можете прямо показать это в списке, я считаю, что html не работает таким образом. Почему вы решили разместить изображения в БД? Это сделает ваш db очень быстрым, вам гораздо лучше создать уникальную ссылку (возможно, с хешем, чтобы люди не угадали путь к другим изображениям) и просто сохранили путь в db. –

+0

Больше мнений о сохранении изображений в db http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay –

+0

Я помещал изображения в db, потому что мне нужен список для хранения и показать имя человека, а также показать его фотографию. Фотография как видимая с первого момента, а не ссылка. –

ответ

1

Настоящая документация по Yii2 https://github.com/yiisoft/yii2/blob/master/docs/guide/input-file-upload.md Это довольно просто.

некоторые комментарии:
1) фотографии могут быть частными, и это может быть большой проблемой, если кто-то угадает путь других. В этом случае вы можете поместить файл где-то НЕ в веб-папку. Если вы это сделаете, вам нужно использовать активы, чтобы показать им assetManager-> getPublishedUrl ('@ app/folder')?>/Fav.ico
2) если фотографии не так чувствительны, то вы можете просто сохранить их где-нибудь в веб-папке.

Как вы можете видеть, у вас могут возникнуть проблемы с загрузкой одного и того же имени файла 2 раза, так как 1 будет переопределять другую. Вы всегда можете переименовать файл, я бы на самом деле изменить свой код, чтобы что-то вроде этого

 if ($model->file && $model->validate()) { 
$model->file = UploadedFile::getInstance($model, 'file'); 
      $filePath = 'uploads/' . hash('ripemd160', microtime()) . $model->file->baseName . '.' . $model->file->extension; 
      $model->fileName = $filePath; 
      $model->save(); 

      $model->file->saveAs('uploadsimg/' . $model->file->baseName . '.' . $model->file->extension); 
      if ($model->load(Yii::$app->request->post()) && $model->save()) { 
       return $this->redirect(Url::toRoute(['create'])); 
      } 
     } 
+0

Большое спасибо за ответ, Михай. Я дам ему попробовать за короткое время :) –

+0

Привет, Михай, я отредактировал ваш код, чтобы вы могли видеть мое фактическое состояние и проблему. –

+0

РЕШЕН. См. Мое полное решение в приведенном выше EDIT. Большое спасибо Михаю, который указал на правильный путь. –

0

Самого короткого пути я нашел, чтобы отобразить изображение из поля BLOB (в базе данных MySQL) использую этот код (в моем вид):

$sql = "SELECT FieldName FROM TableName"; //optional where statements etc. 
$connection = Yii::$app->getDb(); 
$command = $connection->createCommand($sql); 
$imgLogo = $command->queryScalar(); 
echo '<img src="data:image/jpeg;base64,'.base64_encode($imgLogo).'"/>'; 

Обратите внимание, что в этом примере у меня есть только одна строка в таблице «TableName» в качестве этого примера был использован для получения логотипа от компании. И в этой таблице хранится только одна компания.

+0

Большое спасибо. Я постараюсь сделать это как можно скорее. –

Смежные вопросы