You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel项目导出CSV时日文文件名显示异常求助

解决Laravel下载CSV时日文文件名显示为下划线的问题

问题核心是HTTP响应头中的文件名未做正确编码,导致浏览器无法解析日文字符,自动替换为下划线。服务器端存储文件名正常,说明文件生成环节没问题,问题出在下载响应的头信息处理上。

以下是两种可行的解决方案:

方案一:手动编码文件名并设置响应头

Laravel的Response::download()默认处理非ASCII字符的方式存在兼容问题,需要手动对文件名进行编码,同时设置符合标准的响应头:

$currentDate = Carbon::now()->format('Ymd');
$fileName = '【' . $selectedCategory->title . '】' . $headquarterName->title . '_' . $currentDate . '_虎の巻利用状況.csv';
$filePath = storage_path('app/' . $fileName);

// 生成CSV文件的代码保持不变
$csvFile = fopen($filePath, 'w');
$bom = chr(239) . chr(187) . chr(191);
fwrite($csvFile, $bom);
fputcsv($csvFile, $this->getHeaderRow($contents));
foreach ($contents as $data) {
    $dataRow = $this->getDataRow($data);
    $this->customFputcsv($csvFile, $dataRow);
}
fclose($csvFile);

// 处理文件名编码
$encodedFileName = rawurlencode($fileName);
// 兼容不同浏览器的响应头设置
$headers = [
    'Content-Type' => 'text/csv; charset=UTF-8',
    'Content-Disposition' => "attachment; filename=\"$fileName\"; filename*=UTF-8''$encodedFileName"
];

return response()->file($filePath, $headers);

说明:

  • filename*=UTF-8''$encodedFileName 是符合RFC 5987标准的编码方式,现代浏览器均支持
  • 保留filename=\"$fileName\"是为了兼容部分旧版浏览器

方案二:使用streamDownload避免本地文件存储(可选优化)

如果不需要在服务器保留生成的CSV文件,可以直接用streamDownload生成并下载,同时处理文件名编码:

$currentDate = Carbon::now()->format('Ymd');
$fileName = '【' . $selectedCategory->title . '】' . $headquarterName->title . '_' . $currentDate . '_虎の巻利用状況.csv';
$encodedFileName = rawurlencode($fileName);

return response()->streamDownload(function () use ($contents) {
    $csvFile = fopen('php://output', 'w');
    $bom = chr(239) . chr(187) . chr(191);
    fwrite($csvFile, $bom);
    fputcsv($csvFile, $this->getHeaderRow($contents));
    foreach ($contents as $data) {
        $dataRow = $this->getDataRow($data);
        $this->customFputcsv($csvFile, $dataRow);
    }
    fclose($csvFile);
}, $fileName, [
    'Content-Type' => 'text/csv; charset=UTF-8',
    'Content-Disposition' => "attachment; filename*=UTF-8''$encodedFileName"
]);

说明:

  • 这种方式无需生成本地文件,直接输出到浏览器,节省服务器存储空间
  • 同样通过filename*参数指定UTF-8编码的文件名

关键注意点

  • 确保服务器PHP环境默认编码为UTF-8
  • 生成CSV时添加的BOM头是正确的,保证CSV内容里的日文能正常显示
  • 测试不同浏览器(Chrome、Firefox、Safari、IE/Edge)的兼容性,确保文件名在各浏览器中都能正确显示

内容的提问来源于stack exchange,提问作者subash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:34:59