首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Symfony 2中使用Response object强制下载.csv文件?

如何在Symfony 2中使用Response object强制下载.csv文件?
EN

Stack Overflow用户
提问于 2012-04-25 06:42:21
回答 6查看 37.2K关注 0票数 21

我正在使用Symfony 2做一个“下载”控制器,它的唯一目的是发送报头,这样我就可以强制下载.csv文件,但它不能正常工作。

代码语言:javascript
复制
$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文件?如果是这样,我做错了什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-04-25 08:50:54

下面是一个在生产环境中运行良好的最小示例:

代码语言:javascript
复制
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。

你关于在控制器中没有返回语句的评论令人费解。控制器返回一个响应。让框架负责将内容发送到浏览器。

票数 36
EN

Stack Overflow用户

发布于 2012-07-02 23:06:05

我意识到这篇文章有点老了,奇怪的是,除了stackoverflow上的这篇文章之外,实际上没有什么好的资源可以教你如何在symfony 2中做CSV导出。

无论如何,我在一个客户竞赛网站上使用了上面的例子,它工作得很好。但是今天我收到一封电子邮件,在我自己测试之后,代码已经崩溃了--我可以下载少量的结果,但是数据库现在输出了超过31000行,它要么简单地显示文本,要么使用chrome,基本上什么也没做。

对于任何对大型数据导出有问题的人,这是我开始工作的方法,基本上是按照Cerad的建议作为替代方法:

代码语言:javascript
复制
    $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();

编辑:经过更多的测试和增加允许的最大秒数后,我意识到前面的代码打印出了顶部的标题,所以我更新了代码。

票数 8
EN

Stack Overflow用户

发布于 2013-08-26 13:46:14

THis帮助我导出CSV和JSON。

Twig文件命名为: export.csv.twig、export.json.twig

控制器:

代码语言:javascript
复制
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));
    }
}
}

路由:

代码语言:javascript
复制
prototype_export:
    pattern:  /export/{_format}
    defaults: { _controller: PrototypeBundle:Prototype:export, _format: json }
    requirements:
        _format:  csv|json

细枝末节:

export.csv.twig (在这里做逗号分隔的事情,这只是一个测试)

代码语言:javascript
复制
{% for row in data %}
{{ row }}
{% endfor %} 

export.json.twig (数据发送为json_encoded,该文件为空)

希望这能有所帮助!

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10307048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档