Yii2显示存储在BLOB数据库字段中的图像

时间:2014-12-23 23:26:33

标签: database image blob show yii2

问候语

我需要在Yii2中显示存储在LISTVIEW或类似小部件中的BLOB数据库字段中的图像

我有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

的表字段中

我需要在LISTVIEW或类似小部件内的名为view2的视图中显示存储在数据库中的每个blob图像

任何人都知道我需要在view2和HonraController中放置什么代码块来实现这个目标?

修改

解决

这是解决问题的代码,现在一切正常

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

2 个答案:

答案 0 :(得分:1)

以下是关于Yii2 https://github.com/yiisoft/yii2/blob/master/docs/guide/input-file-upload.md的官方文档 这很简单。

一些评论:
1)图片可能是私密的,如果有人猜到别人的路径,这可能是个大问题。在这种情况下,您可以将文件放在某个位置不在Web文件夹中。如果你这样做,那么你必须使用资产向他们展示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']));
            }
        }

答案 1 :(得分: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'中只有一行,因为此示例用于从公司检索徽标。并且该表中只存储了一家公司。