Safari(或 Apple OS)将 .txt 添加到 .csv 下载
Posted
技术标签:
【中文标题】Safari(或 Apple OS)将 .txt 添加到 .csv 下载【英文标题】:Safari (or Apple OS) adding .txt to .csv download 【发布时间】:2014-08-20 05:36:29 【问题描述】:我正在使用 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)
我搜索了谷歌,但只能找到其他有问题的用户 - 没有解决方案,上面的代码已经使用 *** 上的建议进行了编辑: 1.laravel adding .txt on the downloaded file 2.How to use the CSV MIME-type?
谁能告诉我这个问题出现在哪里以及如何解决它? 有没有我可以测试下载的地方,因为我只有 Windows,而且我使用的测试网站只提供视觉渲染。
另外:客户向我保证他可以从其他来源下载 .csv 文件而不会出现此问题
【问题讨论】:
试试"Content-Type: text/csv; charset=utf-8"
【参考方案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"'
);
【讨论】:
像梦一样工作,谢谢,还在类型中包含字符集以上是关于Safari(或 Apple OS)将 .txt 添加到 .csv 下载的主要内容,如果未能解决你的问题,请参考以下文章
网站图像未从 Apple 设备 (Safari) 上的其他服务器加载
Java applet无法在Safari 7下打开文件(Mac OS X 10.9)