PHP:解决Safari浏览器下载文件文件名称乱码的问题
【项目背景】
项目中开发了统一的文件管理器,在其他如IE,Chrome,Firefox等下载正常,但是在苹果Safari浏览器下载就会出现中文名称乱码问题。
【理论知识】
主要是下载Header头不符合RFC规范导致。参考文章:http://www.sohu.com/a/334506221_463987。
【如何解决】
设置统一的下载Header头如下:
<?php /** * 获取下载文件所需headers头信息 * * @param string $filename * @param string $charset 默认UTF-8 * @param string $mimeType 默认application/octet-stream * @return array */ public static function downloadHeaders($filename, $charset = 'UTF-8', $mimeType = 'application/octet-stream') { // 兼容各浏览器下载文件名乱码问题 if (preg_match("/MSIE/", $_SERVER["HTTP_USER_AGENT"])) { $filename = urlencode($filename); $filename = str_replace("+", "%20", $filename);// 替换空格 $attachment = "attachment; filename=\"{$filename}\"; charset={$charset}"; } else if (preg_match("/Firefox/", $_SERVER["HTTP_USER_AGENT"])) { $attachment = 'attachment; filename*=utf-8\'\'' . $filename; } else if (preg_match("/Safari/", $_SERVER["HTTP_USER_AGENT"])) { $filename = rawurlencode($filename); // 注意:rawurlencode与urlencode的区别 $attachment = 'attachment; filename*=utf-8\'\'' . $filename; } else { $attachment = "attachment; filename=\"{$filename}\"; charset={$charset}"; } $headers = [ 'Cache-Control' => 'public, must-revalidate, max-age=0', 'Content-Type' => $mimeType, 'Content-Disposition' => $attachment, ]; return $headers; }