在Yii中下载图像文件后渲染视图

时间:2013-10-25 14:51:34

标签: php yii download render

public function actionViewDownload(){

    // some in internal processing php commands (no echo)

    exec($command); // command to be executed compulsary

    $file = "/images/sample.jpg"; // some images file
    if (file_exists($file)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        readfile($file);
    }
    $this->render('view',array('data'=>$data)); // render the other view of the controller after/during download.

}

我需要执行一个命令,然后下载图像文件,在下载渲染之后或期间,视图。
如果我在下载之前渲染视图,则提示“标题无法修改。标题已经发送”
如果我在下载后渲染视图,那么视图现在会显示在浏览器上,但文件会被下载 我的问题是如何实现三个任务:执行命令(必须先执行),渲染和下载。

1 个答案:

答案 0 :(得分:0)

通过它的外观,当你要求下载一个项目时,你会尝试做类似sourceforge的事情,在该项目中,在呈现页面时将可交付物推送给用户。 我假设exec生成图像。

你真的需要把它分成两个动作:

public function actionViewDownload(){

  // some in internal processing php commands (no echo)

  exec($command); // command to be executed compulsory

  $file = "/images/sample.jpg"; // some images file
  $this->render('view',array(
                  'data'=>$data,
                  'img'=>$file)
               );

}

然后view包含类似的内容:

<img src="<?php echo controller/getdeliverible?file=$img; ?>"/>

反过来调用:

public function actionGetDeliverible($file){

  if (file_exists($file)) {
      header('Content-Description: File Transfer');
      header('Content-Type: application/octet-stream');
      header('Content-Disposition: attachment; filename='.basename($file));
      header('Content-Transfer-Encoding: binary');
      header('Expires: 0');
      header('Cache-Control: must-revalidate');
      header('Pragma: public');
      header('Content-Length: ' . filesize($file));
      readfile($file);
  }
}

我上面的代码很粗糙(你必须正确填写),但你明白了。基本上,当渲染视图时,图像将弹出并要求您保存它。对用户来说,两件事情都在一起发生。 以这种方式执行此操作的好处是,您可以在向用户读取图像后执行某些操作,如果它是临时文件则将其删除,以便无法再次下载。