PHP解决Safari浏览器下载文件文件名称乱码的问题

2023-12-19 15:28

本文主要是介绍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*/
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|MicroMessenger)/", $_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;
}/*** 判断文件是否存在,包含远程文件** @param string $file* @return bool*/
function m_file_exists($file)
{if (preg_match('/^http(s)?:\/\//', $file)) {//远程文件if (ini_get('allow_url_fopen')) {if (@fopen($file, 'r')) {return true;}} else {$parseurl = parse_url($file);$host = $parseurl['host'];$path = $parseurl['path'];$fp = fsockopen($host, 80, $errno, $errstr, 5);if (!$fp) {return false;}fputs($fp, "GET {$path} HTTP/1.1 \r\nhost:{$host}\r\n\r\n");if (preg_match('/HTTP\/1.1 200/', fgets($fp, 1024))) {return true;}}return false;}return file_exists($file);
}header('Content-Type: text/html; charset=utf-8');if ($_GET["type"] == 2) {// https://abc.cde.com/filedownload.php?type=2&fileurl=https%3A%2F%2Fabc.cde.com%2Fpwpublic%2F%E4%BA%BA%E5%91%98%E5%90%8D%E5%8D%95%E6%A8%A1%E6%9D%BF.xlsx&filename=%E4%BA%BA%E5%91%98%E5%90%8D%E5%8D%95%E6%A8%A1%E6%9D%BFtest.xlsx// http://localhost/filedownload.php?type=2&fileurl=https%3A%2F%2Fabc.cde.com%2Fpwpublic%2F%E4%BA%BA%E5%91%98%E5%90%8D%E5%8D%95%E6%A8%A1%E6%9D%BF.xlsx&filename=%E4%BA%BA%E5%91%98%E5%90%8D%E5%8D%95%E6%A8%A1%E6%9D%BFtest.xlsx// https://abc.cde.com/filedownload.php?type=2&fileurl=urlencode{文件下载地址}&filename=urlencode{文件名}// $file_name ='人员名单模板.xlsx';// $file_path = 'https://abc.cde.com/pwpublic/人员名单模板.xlsx';$file_name = urldecode($_GET["filename"]);$file_path = urldecode($_GET["fileurl"]);
} else {$file_name = '团体人员名单模板.xlsx';$file_path = '/home/www/xxx/public/团体人员名单模板.xlsx';
}
if (m_file_exists($file_path) == false) {echo '文件不存在';exit;
}$headers = downloadHeaders($file_name);
foreach ($headers as $k => $v) {header($k . ':' . $v);
}
readfile($file_path);
?>

这篇关于PHP解决Safari浏览器下载文件文件名称乱码的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/512703

相关文章

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

springboot3.4和mybatis plus的版本问题的解决

《springboot3.4和mybatisplus的版本问题的解决》本文主要介绍了springboot3.4和mybatisplus的版本问题的解决,主要由于SpringBoot3.4与MyBat... 报错1:spring-boot-starter/3.4.0/spring-boot-starter-

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

python 3.8 的anaconda下载方法

《python3.8的anaconda下载方法》本文详细介绍了如何下载和安装带有Python3.8的Anaconda发行版,包括Anaconda简介、下载步骤、安装指南以及验证安装结果,此外,还介... 目录python3.8 版本的 Anaconda 下载与安装指南一、Anaconda 简介二、下载 An

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

MySQL安装时initializing database失败的问题解决

《MySQL安装时initializingdatabase失败的问题解决》本文主要介绍了MySQL安装时initializingdatabase失败的问题解决,文中通过图文介绍的非常详细,对大家的学... 目录问题页面:解决方法:问题页面:解决方法:1.勾选红框中的选项:2.将下图红框中全部改为英