0
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.

}

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

4

1 回答 1

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);
  }
}

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

于 2013-10-26T10:44:32.773 回答