Yii2 sendFile() - 试图获取非对象

时间:2016-01-21 05:03:12

标签: php yii2

嘿伙计们我正在尝试设置一个用户可以下载文件的下载按钮,该文件是使用kartik的文件输入窗口小部件(单个上传)上传的。

代码驻留在CRUD生成的视图/控制器/模型中。

这是视图按钮代码,

        <?= Html::a('Download Uploaded File', ['download', 'id' => $model->form_id], [
    'class' => 'btn btn-danger',
    'data' => [
        'confirm' => 'Are you sure you want to download this item?',
        'method' => 'post',
    ],
]) ?>

控制器功能(下载),

public function actionDownload($id) {
    $model = $this->findModel($id);

   $path = Yii::getAlias('@web') . '/uploads';
   $file = '/borang/'.$model->form_id.'.'.$model->file->extension;

   if (file_exists($file)) {

   Yii::$app->response->sendFile($file);

  }
}

控制器功能(在创建操作中的上传)

public function actionCreate()
    {   

        $model = new FormMovement();

        if ($model->load(Yii::$app->request->post())) {

            $model->file = UploadedFile::getInstance($model, 'file');

            if (!empty($model->file) && $model->validate()) {
                    $model->fm_upload = 'uploads/borang/'.$model->form_id.'.'.$model->file->extension;
                    $model->save();
                    $model->file->saveAs('uploads/borang/'.$model->form_id.'.'.$model->file->extension);
                    return $this->redirect(['view', 'id' => $model->form_id]);
            }else{
                $model->save();
                return $this->redirect(['view', 'id' => $model->form_id]);
            }

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

这是错误日志, '试图获取非对象的属性'在C:\ xampp \ htdocs \ adminsys \ frontend \ controllers \ FormMovementController.php:181

指向,

$file = '/borang/'.$model->form_id.'.'.$model->file->extension;

在下载操作(控制器)

3 个答案:

答案 0 :(得分:1)

尝试这种方式:

public function actionDownload($id) {
    $model = $this->findModel($id);

    $path = Yii::getAlias('@web') . '/uploads';
    $ext = substr(strrchr($model->file,'.'),1);
    $file = $path.$model->file;
    $download = '/borang/'.$model->form_id.'.'.$ext;
    if(file_exists($file)) 
       Yii::$app->response->sendFile($download);
}

strrchr()

答案 1 :(得分:1)

问题出现在你的下载功能中。你没有在模型中保存扩展名。有很多方法可以扩展文件。

public function actionDownload($id) {
    $model = $this->findModel($id);

   $path = Yii::getAlias('@webroot') . '/uploads';
   $fileextension=end(explode('.',$model->fm_upload));
   $file = $path.'/borang/'.$model->form_id.'.'.$fileextension;

   if (file_exists($file)) {

   Yii::$app->response->sendFile($file);

  }
}

答案 2 :(得分:0)

您需要确保在服务器上启用set_time_limit以使下载选项正常工作,因为默认情况下它将在服务器上禁用。