yii2 Excel电子表格(xlsx格式)文件上传验证

2024-01-04 03:32

本文主要是介绍yii2 Excel电子表格(xlsx格式)文件上传验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关键位置: vendor/yiisoft/validators/FileValidator.php

    protected function validateExtension($file){$extension = mb_strtolower($file->extension, 'UTF-8');if ($this->checkExtensionByMimeType) {$mimeType = FileHelper::getMimeType($file->tempName, null, false);if ($mimeType === null) {return false;}$extensionsByMimeType = FileHelper::getExtensionsByMimeType($mimeType);if (!in_array($extension, $extensionsByMimeType, true)) {return false;}}if (!empty($this->extensions)) {foreach ((array) $this->extensions as $ext) {if ($extension === $ext || StringHelper::endsWith($file->name, ".$ext", false)) {return true;}}return false;}return true;}

以上代码验证扩展名的流程是:得到上传的文件的(表面)扩展名 $extension,如果允许根据MIME类型检测扩展名,根据已经上传的临时文件获得它的MIME类型 $mimeType,根据 $mimeType 反向去获取可能的后缀 $extensionsByMimeType,如果上传文件的(表面)扩展名的确不在其内,验证失败(即认为那个文件只是伪造了后缀名来作为某种文件),反之,再进一步查验(表面)扩展名是否在模型配置中设定的允许扩展名之内(未配置则略过这一步)。

WPS电子表格文件,xlsx格式,上传后,根据文件推导的MIME类型为:

application/octet-stream

而 Microsoft Office Home and Student 2019 中 Excel 的电子表格文件, xlsx格式,上传后为:

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

Excel建立的文件,用WPS打开,另存为 xlsx 后,就变成 WPS 的 MIME 了。而 LibreOffice 电子表格另存为xlsx后,MIME 是 Excel 一致的。

另外一个 xlsx 文件,不清楚是用什么软件或哪个版本生成的,得到的 MIME 为

application/zip

微软自己的软件对 Excel xlsx电子表格的 MIME 描述最准确,因为它是从文档格式来说的,后面那个不知名软件搞出来的则完全把xlsx文件理解成 用zip压缩的一堆xml文件,这个范围就大了一点了,因为 Office 文件后缀最后带 x 的都是zip压缩的一堆xml文件,而WPS最笼统,直接成了二进制流文件,太多文件是这个东西了。

yii2 根据后缀推导 MIME 类型,内部主要使用 PHP 的 finfo_open 函数,如果要去找一个能够识别 WPS的 magic file,再重新去覆盖写一个 FileValidator,工程量太大。所以,我们采用简单的变通办法:

后端不检查后缀名,但检查 MIME 类型,检查后缀名的工作交给前端完成。

    /*** @var UploadedFile*/public $excelFile;public function rules(){return [[['excelFile'], 'file', 'skipOnEmpty' => false, 'mimeTypes' => ['application/octet-stream','application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','application/zip',]],];}

这篇关于yii2 Excel电子表格(xlsx格式)文件上传验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Python实现pdf电子发票信息提取到excel表格

《Python实现pdf电子发票信息提取到excel表格》这篇文章主要为大家详细介绍了如何使用Python实现pdf电子发票信息提取并保存到excel表格,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录应用场景详细代码步骤总结优化应用场景电子发票信息提取系统主要应用于以下场景:企业财务部门:需

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

GitLab文件的上传与下载方式

《GitLab文件的上传与下载方式》:本文主要介绍GitLab文件的上传与下载方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录GitLab 项目拉取到本地GitLab 项目上传方法方法 1:本地项目未初始化Git方法 2:本地项目已初始化GitGitLab 上

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失