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;
    }
复制代码

 

posted @   冰狼爱魔  阅读(17326)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示