【问题标题】:Downloading a CSV opens up in Web Browser not on a Microsoft Excel下载 CSV 会在 Web 浏览器中打开,而不是在 Microsoft Excel 中打开
【发布时间】:2013-03-20 06:45:02
【问题描述】:

我正在使用 CakePHP 执行此代码:

查看文件

<?php
   if (isset($csv_filename)) {
      header("Content-Disposition: attachment; filename=$csv_filename");
   }
?>
<?=$csv?>

当我运行此页面并下载文件(打开方式)时,它会在 Google Chrome 或 Firefox 等网络浏览器上打开。我希望使用打开此文件

我的预期输出应该是这样的:

实际上,自从我们迁移到 CakePHP 2.2.2 之后,一切都运行良好。

对此有任何想法,我们将不胜感激!谢谢:)

【问题讨论】:

    标签: php cakephp csv


    【解决方案1】:

    添加一个标题,告诉浏览器这是什么 mimetype,就像这样;

    header('Content-Type: application/vnd.ms-excel; charset=utf-8')
    

    【讨论】:

    • 没关系,在你输出任何东西到浏览器之前做吧
    • @igorpan 仍然无法正常工作。下载框还是这个样子i.stack.imgur.com/kimyE.png
    • 您上面的屏幕截图显示“这是一个 Chrome HTML 文档” - 这意味着您没有做任何与问题中的第一张图片不同的事情
    • @AD7six 不,我已经添加了上面的标题,但仍然无法正常工作。
    • 做某事和做正确的事不是一回事。比较您的 3 个屏幕截图,很明显您仍然将 csv 文件作为 html 提供。顺便说一句,Cake 内置了一个 mechanism for sending files (for older versions) - 你应该使用它而不是使用 php 方式。
    【解决方案2】:

    要将文件下载为 CSV,请设置您的路由以检测 CSV。在您的 routes.php 文件中,确保您已为 CSV 设置解析扩展名:-

    Router::parseExtensions('csv');
    

    然后在您的控制器中设置 CSV 的文件名并确保您使用的布局不输出标记(例如默认的 ajax.ctp):-

    $this->response->download("$csv_filename.csv");
    $this->layout = 'ajax';
    

    还要确保您的控制器组件列表中有RequestHandler:-

    public $components = array('RequestHandler');
    

    您只需将您的操作模板放在控制器视图的 csv 目录中。

    如果它仍然不起作用,那么可能有一些标记需要删除。 Cake 的错误可以做到这一点。

    【讨论】:

    • 我已经纠正了错误,但它仍然可以让我在我的问题的第一张图片上下载相同的内容
    • 您确定该文件不包含 HTML 标记吗?保存文件并检查内容。如果文件中存在错误,那么获取在 CakePHP 中工作的 CSV 文件可能会有点麻烦。您可能想查看dereuromark.de/2011/11/21/serving-views-as-files-in-cake2,其中详细介绍了我在此处建议的可下载 CSV 文件的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2012-08-18
    • 2013-04-17
    • 2019-03-08
    相关资源
    最近更新 更多