我正在使用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没有这个问题
答案 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"'
);