Yii Framework 2.0上传文件错误finfo_file():无法打开流:没有这样的文件或目录

时间:2014-11-18 16:17:14

标签: php file-upload yii2

遵循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 ....

结果是图像已上载但模型尚未插入数据库。有谁知道如何解决这个问题?

10 个答案:

答案 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)

此问题可能由两个问题引起,而不仅仅是其他答案中所说的内容:

  1. PHP文件大小限制 - 您需要确保您的PHP设置允许您上传足够大的文件。默认情况下,PHP只允许2mb文件,因此如果您尝试上传更多文件,可能会遇到此错误并且不知道原因。
  2. 您可以通过编辑php.ini文件设置来更改它:

    memory_limit = 32M
    upload_max_filesize = 24M
    post_max_size = 32M
    

    确保post_max_size大于或等于upload_max_file_sizememory_limit大于或等于post_max_size

    1. 模型验证失败 - 模型不再包含上传的临时发布数据。因此,您需要在保存之前验证模型(请注意,这不会在环境/服务器设置中始终如一地发生,因此最安全)。
    2. 以下是如何在控制器中使用它的实用且真实的示例:

      $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($模型 - >文件);模具();