我正在使用Symfony 2做一个“下载”控制器,它的唯一目的是发送报头,这样我就可以强制下载.csv文件,但它不能正常工作。
$response = new Response();
$response->headers->set('Content-Type', "text/csv");
$response->headers->set('Content-Disposition', 'attachment; filename="'.$fileName.'"');
$response->headers->set('Pragma', "no-cache");
$response->headers->set('Expires', "0");
$response->headers->set('Content-Transfer-Encoding', "binary");
$response->headers->set('Content-Length', filesize($fileName));
$response->prepare();
$response->sendHeaders();
$response->setContent(readfile($fileName));
$response->sendContent();
$fileName
是一个"info.csv"
字符串。这就是我在控制器中的动作,没有返回语句。当我尝试返回Response
对象时,浏览器中显示的是文件的内容,而不是我想要的结果。
我发现的问题是,在某些页面中,我确实得到了info.csv file
,但在另一些页面中,我得到的只是一条消息:
No webpage was found for the web address: http://mywebpage.com/download
Error 6 (net::ERR_FILE_NOT_FOUND): The file or directory could not be found.
我完全确定这个文件是存在的,所以一定是另一件事出错了。此外,routing.yml工作正常,因为我确实从链接到该路径的其他页面获得了该文件。Apache错误日志没有显示任何有关它的信息。
以前有没有人在Symfony 2上强制下载.csv文件?如果是这样,我做错了什么?
发布于 2012-04-25 08:50:54
下面是一个在生产环境中运行良好的最小示例:
class MyController
public function myAction()
$response = $this->render('ZaysoAreaBundle:Admin:Team/list.csv.php',$tplData);
$response->headers->set('Content-Type', 'text/csv');
$response->headers->set('Content-Disposition', 'attachment; filename="teams.csv"');
return $response;
如果愿意,您可以将呈现调用替换为新的响应和响应->setContent。
你关于在控制器中没有返回语句的评论令人费解。控制器返回一个响应。让框架负责将内容发送到浏览器。
发布于 2012-07-02 23:06:05
我意识到这篇文章有点老了,奇怪的是,除了stackoverflow上的这篇文章之外,实际上没有什么好的资源可以教你如何在symfony 2中做CSV导出。
无论如何,我在一个客户竞赛网站上使用了上面的例子,它工作得很好。但是今天我收到一封电子邮件,在我自己测试之后,代码已经崩溃了--我可以下载少量的结果,但是数据库现在输出了超过31000行,它要么简单地显示文本,要么使用chrome,基本上什么也没做。
对于任何对大型数据导出有问题的人,这是我开始工作的方法,基本上是按照Cerad的建议作为替代方法:
$filename = "export_".date("Y_m_d_His").".csv";
$response = $this->render('AppDefaultBundle:Default:csvfile.html.twig', array('data' => $data));
$response->setStatusCode(200);
$response->headers->set('Content-Type', 'text/csv');
$response->headers->set('Content-Description', 'Submissions Export');
$response->headers->set('Content-Disposition', 'attachment; filename='.$filename);
$response->headers->set('Content-Transfer-Encoding', 'binary');
$response->headers->set('Pragma', 'no-cache');
$response->headers->set('Expires', '0');
$response->prepare();
$response->sendHeaders();
$response->sendContent();
编辑:经过更多的测试和增加允许的最大秒数后,我意识到前面的代码打印出了顶部的标题,所以我更新了代码。
发布于 2013-08-26 13:46:14
THis帮助我导出CSV和JSON。
Twig文件命名为: export.csv.twig、export.json.twig
控制器:
class PrototypeController extends Controller {
public function exportAction(Request $request) {
$data = array("data" => "test");
$format = $request->getRequestFormat();
if ($format == "csv") {
$response = $this->render('PrototypeBundle:Prototype:export.' . $format . '.twig', array('data' => $data));
$filename = "export_".date("Y_m_d_His").".csv";
$response->headers->set('Content-Type', 'text/csv');
$response->headers->set('Content-Disposition', 'attachment; filename='.$filename);
return $response;
} else if ($format == "json") {
return new Response(json_encode($data));
}
}
}
路由:
prototype_export:
pattern: /export/{_format}
defaults: { _controller: PrototypeBundle:Prototype:export, _format: json }
requirements:
_format: csv|json
细枝末节:
export.csv.twig (在这里做逗号分隔的事情,这只是一个测试)
{% for row in data %}
{{ row }}
{% endfor %}
export.json.twig (数据发送为json_encoded,该文件为空)
希望这能有所帮助!
https://stackoverflow.com/questions/10307048
复制相似问题