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

相关文章

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

在Ubuntu上打不开GitHub的完整解决方法

《在Ubuntu上打不开GitHub的完整解决方法》当你满心欢喜打开Ubuntu准备推送代码时,突然发现终端里的gitpush卡成狗,浏览器里的GitHub页面直接变成Whoathere!警告页面... 目录一、那些年我们遇到的"红色惊叹号"二、三大症状快速诊断症状1:浏览器直接无法访问症状2:终端操作异常

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造