Yii2:finfo_file(C:\ xampp \ tmp \ php29C.tmp):无法打开流:没有这样的文件或目录

时间:2016-02-10 17:45:31

标签: yii2 yii2-advanced-app

上传多个文件时收到错误finfo_file(C:\xampp\tmp\php29C.tmp): failed to open stream: No such file or directory

尝试在$model->save();之前插入saveAs(),但之后只上传了一个文件而不是所有文件,也没有获取数据库中的路径正在上传

控制器:

public function actionCreate()
        {
            $model = new RoomTypes();

            if ($model->load(Yii::$app->request->post()))
            {
                $imageName = $model->room_type;
                     $model->file = UploadedFile::getInstances($model, 'file');

                foreach ($model->file as $file_instance) 
                {
                        $model->save();
                        $file_instance->saveAs('uploads/room_img/' . $file_instance->baseName . '.' . $file_instance->extension);
                        //save the path in the db column
                        $file_instance->$model->images = 'uploads/room_img/'.$imageName.'.'.$file_instance->extension;


                        return $this->redirect(['view', 'id' => $model->id]);
                }
            } 
            else 
            {
                return $this->render('create', 
                    [
                    'model' => $model,
                ]);
            }
        }

1 个答案:

答案 0 :(得分:0)

我可能已经在您的评论后的最后一次更新中回复了此here,但我在这里添加了一个不同的答案,因为这是另一个不同的问题。保存文件后使用$file_instance->baseName$file_instance->extension时会抛出此错误。 saveAs()其内容如下:

public function saveAs($file, $deleteTempFile = true)
{
    if ($this->error == UPLOAD_ERR_OK) {
        if ($deleteTempFile) {
            return move_uploaded_file($this->tempName, $file);
        } elseif (is_uploaded_file($this->tempName)) {
            return copy($this->tempName, $file);
        }
    }
    return false;
}

默认情况下将布尔$deleteTempFile参数设置为 true 。这意味着它将在保存后删除临时文件,您将无法再次在同一请求中保存上传的文件。如果需要,您可以通过执行以下操作将其设置为 false

$file_instance->saveAs('...',false)

但是在这种情况下它不会是一个好习惯,因为你得到同一个文件的2份副本。如果文件已保存到新路径,那么为什么不从tmp文件夹中删除它。只需在调用saveAs()之前将该路径保存在变量中,并在需要时使用它,就像在上面链接的答案中一样:

$path = 'uploads/room_img/' . $file_instance->baseName . '.' . $file_instance->extension;
$file_instance->saveAs($path);
$model->images = $path;

您需要解决的其他问题包括:

foreach ($model->file as $file_instance) 
{
     $model->save();
     $model->images = $path;
}

$model->save()这里没有逻辑。您有一个对象和foreach文件实例的单个实例存储在其属性$model->file中,您将一次又一次地保存孔模型。我从第二个($model->images = $path)了解到,您的模型具有属性images,您可以为其指定字符串值。但是这里有多个图像,每个图像都有自己的路径,在循环内部,每次使用下一个图像路径字符串时都会覆盖它。如果是这种情况我可能会存储文件夹的路径,我可以在以后找到所有这些图像:

$model->images = 'uploads/room_img/[a_collection_id_or_wathever_unique]/'

在该文件夹中,我将托管相关图像。或者我可以通过在循环中执行此操作来托管由;分隔的所有路径或等效路径:

$model->images .= $path . ';';

如果images是由 ActiveRecord 类表示的相关模型,则上面链接的答案应该修复它。