遵循Yii Framework 2.0文档http://www.yiiframework.com/doc-2.0/guide-input-file-upload.html我尝试上传图片。图像可以成功上传,但在上传图像后,我尝试使用以下代码将模型插入数据库。
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
$model->save();
我收到以下错误:
PHP Warning – yii\base\ErrorException
finfo_file(/tmp/phpIGuwiT): failed to open stream: No such file or directory
1. in /var/www/html/website/advanced/vendor/yiisoft/yii2/helpers/BaseFileHelper.php
if ($info) {
$result = finfo_file($info, $file);
finfo_close($info);
if ($result !== false) {
return $result;
}
}
2. in /var/www/html/my-project/advanced/vendor/yiisoft/yii2/validators/FileValidator.php – yii\helpers\BaseFileHelper::getMimeType()
$mimeType = FileHelper::getMimeType($file->tempName, null, false);
3.
4.
and so on ....
结果是图像已上载但模型尚未插入数据库。有谁知道如何解决这个问题?
答案 0 :(得分:12)
我遇到了完全相同的问题,我通过调用
解决了这个问题$model->save();
之前
$model->file->saveAs()
我不知道你的模型是怎样的,但是如果你只是将实际文件保存在服务器上,而只保存数据库中图像的路径,那么它应该可以工作。
我认为当模型> save之前调用file-> saveAs()时,模型验证会失败,因为' file'不再包含上传的数据(它已保存为...)。希望它有意义。
答案 1 :(得分:8)
$model->file->saveAs();
//try delete imageFile file variable before save model
$model->imageFile = null;
$model->save();
答案 2 :(得分:5)
我遇到了同样的问题,我解决了这个问题。
$model->file->saveAs($filepath , false)
然后
$model->save(false)
重要提示:在saveAs
函数传递False
参数中。
答案 3 :(得分:2)
此问题可能由两个问题引起,而不仅仅是其他答案中所说的内容:
您可以通过编辑php.ini文件设置来更改它:
memory_limit = 32M
upload_max_filesize = 24M
post_max_size = 32M
确保post_max_size
大于或等于upload_max_file_size
且memory_limit
大于或等于post_max_size
。
以下是如何在控制器中使用它的实用且真实的示例:
$model->upload_file = UploadedFile::getInstance($model, 'upload_file');
if ($model->validate()) {
if ($model->upload_file->saveAs('my/path/filename.txt')) {
$model->upload_file = null;
$model->save(false);
return ['status' => 'success']; // return your custom success
} else return ['status'=>'error']; // return your validation errors
}
} else return ['status'=>'error']; // return your validation errors
答案 4 :(得分:1)
您需要首先调用 $ model-> save(),然后再调用 $ model-> file-> saveAs()。以下是供参考的代码。
if($model->file) {
$imagename = 'Profile_'.$model->created_at.rand(100000, 999999);
$model->profilepic = $imagename.'.'.$model->file->extension;
$path = 'uploads/';
}
if($model->save()) {
$model->file ? $model->file->saveAs($path.$imagename.'.'.$model->file->extension): null;
//the render or redirect code goes here on success
} else {
//if the validation fails then it will be executed
}

答案 5 :(得分:0)
执行以下操作
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
// rewrite the file attribute to saved url of the file.
$model->file = 'uploads/' . $model->file->baseName . '.' . $model->file->extension;
$model->save();
希望这有帮助!
答案 6 :(得分:0)
我的解决方案如下:
$model = new Film();
$uploads = Yii::getAlias('@uploads'); // Alias root_dir/uploads
if ($model->load(Yii::$app->request->post())) {
$file = UploadedFile::getInstance($model, 'poster');
$imageName = rand(9999, 999999);
$file->name = $imageName . '.' . $file->extension; // override the file name
$model->poster = $file;
if($model->validate() && $model->save()) {
$file->saveAs($uploads . '/posters/' . $model->poster);
return $this->redirect(['view', 'id' => $model->film_id]);
}
}
return $this->render('create', [
'model' => $model
]);
答案 7 :(得分:0)
替换
$model->save()
通过
$model->save(false)
这是因为当你执行没有参数的$ model-> save()时,它默认会考虑true
,即输入必须经过验证
(reference)。
并且所有输入必须在上传或保存在数据库之前进行验证,即上面
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
行和
$模型 - >保存()
线
所以最后我的建议是
在你的XyzController.php中("创建"(可能是actionCreate)场景)
...
...
if($model->validate()) // in "create" (actionCreate possibly) scenario
{
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
$model->save(false);
}
else
{
$msg = 'Error in saving data! Invalid data';
return $this->render('back', ['err_msg'=>$msg]);
}
...
...
这在创建场景中可以正常工作, 但是"更新" (可能是actionUpdate)场景? 在那种情况下,我测试了Aleksandr Ivin(上面)的答案,它工作正常。 这是描述
如果图像上传不是强制性的,则
...
...
if($model->image_file = UploadedFile::getInstance($model, 'image_file'))
{
// do all uploading stuffs here like below line
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
}
$model->image_file = null;
if($model->save(true))
{
$msg = 'Success!'; // set this as flash message if you need
return $this->redirect(['index']);
}
...
...
答案 8 :(得分:0)
尝试$model->file->saveAs($filepath, false)
而不是$model->file->saveAs($filepath)
或者在致电$model->file = null
之前设置$model->file->saveAs()
将解决问题
答案 9 :(得分:0)
当我们保存到db中的image字段时,只需使用
$模型 - >文件 - >名称;
当您尝试打印$ model->文件时,您将获得一个数组
的print_r($模型 - >文件);模具();