скачать действие в gridview yii2

Я очень новичок в YII2. Я хочу создать функцию загрузки для файла, который был загружен ранее. Я упомянул, как создать загрузку действий в Gridview в Yii2. Однако, когда я нажимаю кнопку загрузки, загружается пустая страница. Вот код.

В сетке

<?=GridView::widget([
        'dataProvider'=>$dataProvider,
        'id'=>'mygrid',
        'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        'project_name',
        'project_file',
        'created_date',
        [
        'class'    => 'yii\grid\ActionColumn',
        ],
        ['attribute'=>'Download',
        'format'=>'raw',
        'value' => function($data)
        {
        return
        Html::a('Download file', ['firstyear/download', 'id' => $data->id],['class' => 'btn btn-primary']);

        }
        ],
            ]

]); ?>

В действииСкачать

public function actionDownload($id) 
{ 
$download = Firstyear::findOne($id); 
$path=Yii::getAlias('@webroot').'/uploads/'.$download->project_file;
if (file_exists($path)) {

    return Yii::$app->response->sendFile($path);

}
}

В actionCreate (загрузить файл)

public function actionCreate()
{
    $model = new Firstyear();
    if ($model->load(Yii::$app->request->post())) 
    {      
            $project =$model->project_name;
            $model->file= UploadedFile::getInstance($model,'file');
            $model-> file->saveAs('uploads/'.$project.'.'.$model->file->extension);
            $model->project_file='uploads/'.$project.'.'.$model->file->extension;

            $model->save();
            Yii::$app->getSession()->setFlash('success','Data saved!');
            return $this->redirect(['view','id'=> $model->id]);
            } 

            else {

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

}

Спасибо.


person Fyp16    schedule 29.10.2016    source источник


Ответы (1)


Я подозреваю, что $path неверен, в действии create вы уже включили папку uploads в свой $model->project_file

public function actionCreate()
{
    $model = new Firstyear();
    if ($model->load(Yii::$app->request->post())) 
    {      
            .......
            $model->project_file='uploads/'.$project.'.'.$model->file->extension;
            $model->save();
            ....
     }         

}

но вы используете его снова в actionDownlaod

public function actionDownload($id) 
{ 
    .....
    $path=Yii::getAlias('@webroot').'/uploads/'.$download->project_file;
    if (file_exists($path)) {
        return Yii::$app->response->sendFile($path);

    }
}

попробуйте удалить папку uploads в actionDownlaod и добавить отладочное сообщение

    public function actionDownload($id) 
    { 
        .....
        $path=Yii::getAlias('@webroot').'/'.$download->project_file;
        if (file_exists($path)) {
            return Yii::$app->response->sendFile($path);
        } else {
            throw new NotFoundHttpException("can't find {$download->project_file} file");
        }
    }
person David    schedule 30.10.2016
comment
Спасибо, Дэвид.. Большое вам спасибо.. Отлично! Оно работает! @Дэйвид - person Fyp16; 30.10.2016