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)

(目标 C)打开默认的 Apple Mail 应用程序、Yahoo Mail 或 Safari,而没有撰写屏幕?

Apple拒绝了Safari插件:“不使用自定义图标”

Apple iOS Safari 扩展权限

iCloud:在 OS X 上获取云中存在的一系列 txt 文件