2016-09-07 17 views
0

yii2プロジェクトでは、データベースにパスが保存されているファイルをダウンロードするためにコンポーネントを使用しています。カスタムコンポーネントを使用したYii2ファイルのダウンロード

は、私はセットアップ上記のコードでのコントローラのアクションへのリンクを持っている私のアクション列

['class' => 'yii\grid\ActionColumn', 
       'template'=>'{update}{pdf}{delete}', 
       'buttons'=>[ 
        // to display pdf icon. 
        'pdf' => function ($url, $model) {  
           $id = []; 
           foreach ($model->sdsrefs as $mod) 
            $id[] = $mod->file_id; 
            return Html::a('<span class="glyphicon glyphicon-download-alt"></span>', Url::to(['product/download', 'id' => implode($id)]), [ 

            ]);      
          } 
       ], 
       'options'=>[ 
        'style'=>'width:70px;' 
       ] 
    ], 

にセットアップダウンロードボタンを持っています。

ダウンロードするために、私はコンポーネントを呼び出していますコントローラのアクションで私のコントローラのアクション

public function actionDownload($id) 
    { 
     Yii::$app->files->downloadFile($id); 
     $searchModel = new ProductSearch(); 
     $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 


     return $this->render('index', [ 
      'searchModel' => $searchModel, 
      'dataProvider' => $dataProvider, 
     ]); 

    } 

。ここで何が起きるのかは、PDFボタンをクリックするとページ内のコンテンツをエコーアウトするときにダウンロードするのではなく、私はそれがファイルのdowloadを実行したいPdfボタンを押したとき。

コンポーネントのダウンロード機能。

public static function downloadFile($id) { 
     $file = File::findOne($id); 
     $filepath = Files::getFilePath($id); 
     if (file_exists($filepath)) { 
      header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
      header('Content-Description: File Transfer'); 
      header('Content-Type: application/octet-stream'); 
      header('Content-Disposition: attachment; filename='.$file->file_name); 
      header('Content-Length: ' . filesize($filepath)); 
      readfile("$filepath"); 
     }else{ 
      echo "file not exist: ".$filepath;    
     } 
     exit; 
    } 

pdfアクションボタンをクリックすると、どのように私の結果を得ることができますか?

答えて

2

なぜあなたはResponseオブジェクトのSENDFILE()メソッドを使用しないでくださいありがとう!

return Yii::$app->response->sendFile($pathFile, $filename); 

チェックドキュメントで:http://www.yiiframework.com/doc-2.0/yii-web-response.html#sendFile()-detail

+0

ファイル・パスは、すでに私たちのプロジェクトで実装されています。したがって、コンポーネントを使用してファイルパスのセットアップとダウンロードオプションを使用する必要があります –

関連する問題