fed*_*fed 19 csv download symfony
我正在使用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();
Run Code Online (Sandbox Code Playgroud)
$fileName是一个"info.csv"字符串.这是我在我的控制器内的行为,没有退货声明.当我尝试返回ResponseObject时,文件的内容显示在浏览器中,而不是我想要的结果.
我发现的问题是,在某些页面中我确实得到了我的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文件吗?如果是这样,我做错了什么?
Cer*_*rad 35
这是一个在生产中运行良好的最小示例:
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;
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以使用新响应和response-> setContent替换render调用.
你对控制器内部没有返回语句的评论令人费解.控制器返回响应.让框架负责将内容发送到浏览器.
我发现这篇文章有点陈旧,奇怪的是,除了这篇文章在stackoverflow之外,几乎没有关于如何在symfony 2中进行CSV导出的好资源.
无论如何,我使用上面的例子作为客户竞赛网站,它运作良好.但是今天我收到了一封电子邮件,经过我自己的测试后,代码已经坏了 - 我能够通过少量的结果获得下载工作,但是数据库现在导出超过31,000行,它只是显示文本或者铬,基本上什么也没做.
对于任何有大数据导出问题的人来说,这就是我为了上班而做的事情,基本上做了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();
Run Code Online (Sandbox Code Playgroud)
编辑:经过更多测试并提高允许的最大秒数后,我意识到之前的代码是在顶部打印出标题,所以我更新了代码.
这对我有用,可以导出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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
路由:
prototype_export:
pattern: /export/{_format}
defaults: { _controller: PrototypeBundle:Prototype:export, _format: json }
requirements:
_format: csv|json
Run Code Online (Sandbox Code Playgroud)
小树枝:
export.csv.twig(在这里做你的逗号分隔,这只是一个测试)
{% for row in data %}
{{ row }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
export.json.twig(数据发送json_encoded,此文件为空)
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
33216 次 |
| 最近记录: |