Safari(或苹果操作系统)添加.txt到.csv下载


Safari (or Apple OS) adding .txt to .csv download

我正在使用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)

我已经搜索了谷歌,但只能找到其他用户的问题-没有解决方案,上面的代码已经编辑使用建议找到Stackoverflow:1. Laravel在下载的文件中添加。txt2. 如何使用CSV mime类型?

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

另外:客户已经向我保证他可以从其他来源下载csv文件而不会出现这个问题

正如我所看到的,Symfony以键值对的形式遍历标头:

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

然后这样设置它们:

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"'
);