问候语
我需要在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
答案 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'中只有一行,因为此示例用于从公司检索徽标。并且该表中只存储了一家公司。