Safari(或Apple OS)将.txt添加到.csv下载

时间:2014-06-29 20:45:41

标签: php macos safari fopen fputcsv

我正在使用PHP从Laravel中的数据库条目创建一个简单的.csv,这里有一些代码示例:

$file = fopen(storage_path('file.csv'), 'w');
//$printer = array from database     
foreach ($printer as $row) {
    fputcsv($file, $row);
}
fclose($file);
//$formname = Object values
$headers = array(
      'Content-Type: text/csv',
      'Content-Length: ' . filesize(storage_path('file.csv')),
      'Content-Disposition: attachment; filename="'.$formname->name.'.csv"'
);
return Response::download(storage_path('file.csv'), $formname->name.'.csv', $headers);

对我来说,所有标准和工作都很好,但我的客户正在使用OS X 10.9.3& Safari 7.0.4和每个下载都有一个.txt扩展名,我无法找到从服务器端或客户端停止它的方法。 (所以下载为file.csv.txt)

我搜索了Google,但只能找到有问题的其他用户 - 没有解决方案,上面的代码已经使用Stackoverflow上的建议进行了编辑: 1. laravel adding .txt on the downloaded file 2. How to use the CSV MIME-type?

谁能告诉我这个问题出在哪里以及如何解决? 有没有我可以测试下载的地方,因为我只有Windows和我使用的测试网站只提供可视化渲染。

另外:客户向我保证他可以从其他来源下载.csv没有这个问题

1 个答案:

答案 0 :(得分:1)

正如我可以通过标题看到Symfony iterates作为键值对:

public function __construct(array $headers = array())
{
    foreach ($headers as $key => $values) {
        $this->set($key, $values);
    }
}

然后以这种方式sets

if (true === $replace || !isset($this->headers[$key])) {
    $this->headers[$key] = $values;
} else {
    $this->headers[$key] = array_merge($this->headers[$key], $values);
}

因此,如果$headers数组中的值只包含数字索引,则结果可能是意外的。尝试将您的代码更改为:

$headers = array(
    'Content-Type' => 'text/csv',
    'Content-Length' => filesize(storage_path('file.csv')),
    'Content-Disposition' => 'attachment; filename="'.$formname->name.'.csv"'
);