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
相关产品推荐
相关产品推荐

