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

相关文章

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

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

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

Java JDK Validation 注解解析与使用方法验证

《JavaJDKValidation注解解析与使用方法验证》JakartaValidation提供了一种声明式、标准化的方式来验证Java对象,与框架无关,可以方便地集成到各种Java应用中,... 目录核心概念1. 主要注解基本约束注解其他常用注解2. 核心接口使用方法1. 基本使用添加依赖 (Maven

java读取excel文件为base64实现方式

《java读取excel文件为base64实现方式》文章介绍使用ApachePOI和EasyExcel处理Excel文件并转换为Base64的方法,强调EasyExcel适合大文件且内存占用低,需注意... 目录使用 Apache POI 读取 Excel 并转换为 Base64使用 EasyExcel 处

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

Python Excel 通用筛选函数的实现

《PythonExcel通用筛选函数的实现》本文主要介绍了PythonExcel通用筛选函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录案例目的示例数据假定数据来源是字典优化:通用CSV数据处理函数使用说明使用示例注意事项案例目的第一

Java利用Spire.XLS for Java设置Excel表格边框

《Java利用Spire.XLSforJava设置Excel表格边框》在日常的业务报表和数据处理中,Excel表格的美观性和可读性至关重要,本文将深入探讨如何利用Spire.XLSforJava库... 目录Spire.XLS for Java 简介与安装Maven 依赖配置手动安装 JAR 包核心API介

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF