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.
}
我需要执行一个命令,然后下载图像文件,在下载渲染之后或期间,视图。
如果我在下载之前渲染视图,则提示“标题无法修改。标题已经发送”
如果我在下载后渲染视图,那么视图现在会显示在浏览器上,但文件会被下载
我的问题是如何实现三个任务:执行命令(必须先执行),渲染和下载。
答案 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);
}
}
我上面的代码很粗糙(你必须正确填写),但你明白了。基本上,当渲染视图时,图像将弹出并要求您保存它。对用户来说,两件事情都在一起发生。 以这种方式执行此操作的好处是,您可以在向用户读取图像后执行某些操作,如果它是临时文件则将其删除,以便无法再次下载。