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

相关文章

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

Java利用poi实现word表格转excel

《Java利用poi实现word表格转excel》这篇文章主要为大家详细介绍了Java如何利用poi实现word表格转excel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、每行对象类需要针对不同的表格进行对应的创建。package org.example.wordToEx

利用Python实现添加或读取Excel公式

《利用Python实现添加或读取Excel公式》Excel公式是数据处理的核心工具,从简单的加减运算到复杂的逻辑判断,掌握基础语法是高效工作的起点,下面我们就来看看如何使用Python进行Excel公... 目录python Excel 库安装Python 在 Excel 中添加公式/函数Python 读取

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现