Yii2 - finfo_file(/ tmp / phpqE6gyD):无法打开流:文件上传后保存时没有此类文件或目录

时间:2016-03-23 14:03:40

标签: php yii yii2

当我尝试在文件上传后将数据保存到数据库中时出现以下错误:

finfo_file(/tmp/phpqE6gyD): failed to open stream: No such file or directory 

这是代码:

$ userFolderPath = \ Yii :: getAlias(' @ webroot')。 DIRECTORY_SEPARATOR。 '文件' 。 DIRECTORY_SEPARATOR。 \ Yii的:: $ APP->用户>的getIdentity() - > ID用户所;

        $model = new CsFile();
        $files = UploadedFile::getInstances($model, 'files');
        $errors = [];

        if (!file_exists($userFolderPath))
            mkdir($userFolderPath, 0777, true);

        foreach($files as $file):
            $fileModel = new CsFile();
            $fileModel->files = $file;

            if($fileModel->validate()):

                $filename = str_replace(' ', '_', $file->baseName);

                if(file_exists($userFolderPath . DIRECTORY_SEPARATOR . $filename . "." . $file->extension)):
                     $filename .= "-" .uniqid();
                endif;

                $fileModel->files
                    ->saveAs($userFolderPath .DIRECTORY_SEPARATOR. $filename . '.' . $fileModel->files->extension);

                $fileModel->iduser    = Yii::$app->user->getIdentity()->iduser;
                $fileModel->name      = $filename;
                $fileModel->extension = $file->extension;
                $fileModel->add_date  = date('Y-m-d H:i:s');
                $fileModel->save();

            else:

            endif;

        endforeach;

        var_dump('<pre>', $errors, '</pre>');

5 个答案:

答案 0 :(得分:2)

几个星期前我遇到了同样的问题。事实证明,当我们在上传之前重命名文件并尝试保存模型时,会出现此错误。

如果该属性仅用于处理您的上传并且表格中没有字段,则可以在保存之前取消设置此字段:$files Model->files = null

如果您的情况与我的情况不同,请告诉我。

答案 1 :(得分:0)

Yii2通过函数$model->upload()使用UploadFile类来保存上传文件

要在$model->upload功能中修复此用途:

return copy($this->YourAttribute->tempName, $newFileName);

而不是

return $model->attribute->saveAs($newFileName)

答案 2 :(得分:0)

克莱夫是对的。但是,如果要保存数据库中的文件路径以便稍后读取,则将该属性设置为null将不起作用。

问题是当你试图在$ model-&gt; file-&gt; saveAs()已经使用的文件字段中保存模型时仍然使用UploadedFile :: getInstance($ model,'file')的结果; $ model-&gt; save()无法直接保存已保存和已删除的临时文件路径。 因此,在成功获得$ model-&gt; file-&gt; saveAs($ path)后,您需要执行以下操作:

$ model-&gt; file = $ path;

我很不清楚并在fileinfo之后花了一些时间,所以希望答案有所帮助。

答案 3 :(得分:0)

我遇到了同样的问题,为此我解决了该问题:

$model->file->saveAs($filepath , false)

然后...

$model->save(false)

重要提示:在saveAs函数中,传递false参数。

答案 4 :(得分:0)

$ model-> save(false)中使用 false 参数,这意味着您正在忽略模型验证,这是不正确的。

但是在 $ file-> saveAs($ path,false)中使用 false 作为第二个参数意味着您试图将文件保持在 temp 文件夹后,在尝试保存到数据库时允许模型在验证期间访问文件。

如果模型无法访问文件(即在上传后从临时文件夹中删除),则会显示错误无法打开流,没有此类文件/文件夹< / strong>