Php Yii Framework 2.0上载文件错误finfo_file():无法打开流:没有此类文件或目录
遵循YIIFramework2.0文档,我尝试上传图像。图像可以成功上传,但上传图像后,我尝试使用以下代码将模型插入数据库Php Yii Framework 2.0上载文件错误finfo_file():无法打开流:没有此类文件或目录,php,file-upload,yii2,Php,File Upload,Yii2,遵循YIIFramework2.0文档,我尝试上传图像。图像可以成功上传,但上传图像后,我尝试使用以下代码将模型插入数据库 $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension); $model->save(); 我得到了以下错误: PHP Warning – yii\base\ErrorException finfo
$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 ....
结果是图像已上载,但模型尚未插入数据库。有人知道如何解决这个问题吗?我遇到了完全相同的问题,我打电话解决了这个问题
$model->save();
以前
$model->file->saveAs()
我不知道您的模型是什么样子的,但是如果您只是在服务器上保存实际文件,并且只保存数据库中映像的路径,那么它应该可以工作
我认为,当您在model->save之前调用file->saveAs()时,模型验证会失败,因为“file”不再包含上传的数据(它已经保存为…)。希望这是有意义的。按以下步骤操作
$model->file->saveAs();
//try delete imageFile file variable before save model
$model->imageFile = null;
$model->save();
$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();
希望这有帮助 我的解决方案如下所示:
$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
]);
替换
$model->save()
借
$model->save(false)
这是因为当您执行$MODE-> SAVER()时,它将不考虑任何参数:<代码>真< /代码> IE,输入必须被验证。 (). 在上传或保存到上面的数据库ie之前,必须验证所有输入
$model->file->saveAs('uploads/')。$model->file->baseName'。
$model->file->extension)代码>
线路和
$model->save()
线
所以最后我的建议是
在XyzController.php中(在“创建”(actionCreate)场景中)
这在创建场景中可以很好地工作,
但“更新”(可能的操作更新)场景如何?
在这种情况下,我已经测试了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']);
}
...
...
尝试$model->file->saveAs($filepath,false)
而不是$model->file->saveAs($filepath)
或者在调用之前设置$model->file=null
,$model->file->saveAs()
将解决在数据库中保存到图像字段时的问题,只需使用
$model->file->name
当您尝试打印$model->file时,将得到一个数组
打印($model->file);模具()
此问题可能由两个问题引起,而不仅仅是其他答案中所述的问题:
PHP文件大小限制-您需要确保您的PHP设置允许上载足够大的文件。默认情况下,PHP只允许2mb文件,因此如果您尝试上载更多文件,您可能会遇到此错误,并且不知道原因
您可以通过编辑php.ini文件设置进行更改:
memory_limit = 32M
upload_max_filesize = 24M
post_max_size = 32M
确保post_max_size
大于或等于upload_max_file_size
且内存限制
大于或等于post_max_size
模型验证失败-模型不再包含上载的临时post数据。因此,您需要在保存模型之前对其进行验证(请注意,为了安全起见,这种情况不会在不同的环境/服务器设置中持续发生)
下面是一个实际的例子,说明了如何在控制器中使用它:
$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
我也有同样的问题,我用这个来解决
$model->file->saveAs($filepath,false)
然后
$model->save(false)
重要提示:在saveAs
函数中,传递False
参数。您需要先调用$model->save(),然后调用$model->file->saveAs()。以下是参考代码
如果($model->file){
$imagename='Profile.'$model->created_at.rand(100000,999999);
$model->profilepic=$imagename..$model->file->extension;
$path='uploads/';
}
如果($model->save()){
$model->file?$model->file->saveAs($path.$imagename...$model->file->extension):空;
//成功后,呈现或重定向代码将显示在此处
}否则{
//如果验证失败,则将执行验证
}
请使用您的型号代码更新您的问题。如果您有任何解决方案,请更新。我也有同样的问题。ThanksI在控制器中没有saveas()方法。。。仅save()方法…您将此代码放在何处?我认为这不是合适的解决方案,因为如果我们在文件上载时出错,那么(例如文件/目录读写权限)?保存在数据库中的记录不会有任何相应的图像/文件如果文件未成功上载(可能会出现某些文件权限问题),该怎么办?不建议在保存前更改文件名。首先上载文件,然后在数据库中更改其名称和路径(if)。关闭模型验证是错误的。修复问题比假装不存在要好。我们已经使用$model->validate()验证了模型,所以为什么要验证两次呢?因为这是错误的代码,您没有修复问题,只是忽略了它。将file对象设置为nuill,$model->file=null;然后可以调用$model->save(),而无需取消验证。你会得到更好的代码和更干净的流程。这就是我在回答中提到的,请查看上面的actionUpdate
scenario这个答案应该被提升,而@s_mdq的答案可能会导致在文件上传因任何原因失败时将不正确的信息保存到数据库中。你能解释一下为什么会这样吗?
$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