当前位置: 首页 > news >正文

前端添加压缩包内文件名称校验

1. tar包内文件名称校验

1. 读取tar包内所有的文件名称

export class TarReader {fileInfo: any[]buffer: string | ArrayBufferconstructor() {this.fileInfo = []}readFile(file) {return new Promise(resolve => {const reader = new FileReader()reader.onload = event => {this.buffer = event.target.resultthis.fileInfo = []this.readFileInfo()resolve(this.fileInfo)}reader.readAsArrayBuffer(file)})}readFileInfo() {this.fileInfo = []let offset = 0let fileSize = 0let fileName = ''while (offset < (this.buffer as ArrayBuffer).byteLength - 512) {fileName = this.readFileName(offset) // file nameif (fileName.length === 0) {break}fileSize = this.readFileSize(offset)this.fileInfo.push({name: fileName,size: fileSize,headerOffset: offset})offset += 512 + 512 * Math.trunc(fileSize / 512)if (fileSize % 512) {offset += 512}}}getFileInfo() {return this.fileInfo}readString(strOffset, size) {const strView = new Uint8Array(this.buffer as ArrayBuffer, strOffset, size)const i = strView.indexOf(0)const td = new TextDecoder()return td.decode(strView.slice(0, i))}readFileName(headerOffset) {const name = this.readString(headerOffset, 100)return name}readFileSize(headerOffset) {// offset: 124const szView = new Uint8Array(this.buffer as ArrayBuffer,headerOffset + 124,12)let szStr = ''for (let i = 0; i < 11; i++) {szStr += String.fromCharCode(szView[i])}return parseInt(szStr, 8)}
}

2. 校验tar包内文件名称

// 名称校验规则
const nameRule = str => {return !/^[a-z|A-Z|0-9|\/\.\#\-|_|]{1,250}$/g.test(str)
}// 根据名称规则校验tar包内文件名称
const validateTarFileNames = async file => {try {const instance = new TarReader()const list = (await instance.readFile(file)) as any[]if (Array.isArray(list)) {for (const item of list) {const fileName = item.nameif (nameRule(fileName)) {return true}}}} catch {return false}
}

2. zip包内文件名称校验

使用jszip插件

const validateZipFileNames = async file => {try {const zip = new JSZip()const data = await fileawait zip.loadAsync(data)// 获取所有文件列表const files = Object.keys(zip.files)// 遍历每个文件并判断文件名是否符合条件for (const fileName of files) {if (nameRule(fileName)) {return true}}} catch (error) {return false}
}

3. 使用

// 如果是tar压缩包
const tarRes: any = await validateTarFileNames(file)
if (tarRes) {console.log('压缩包内有名称不符合校验规则');
}
// 如果是zip压缩包const zipRes = await validateZipFileNames(file)
if (zipRes) {console.log('压缩包内有名称不符合校验规则');
}

 

 

http://www.lryc.cn/news/311744.html

相关文章:

  • redis02 安装
  • #QT(QT时钟)
  • T-RAG:结合实体检测的增强检索生成模型
  • u-boot: NAND 驱动简介
  • 史上最全的大数据开发八股文【自己的吐血总结】
  • 数据库学习案例20240304-mysql数据库案例总结(碎片,统计信息)
  • 【小白友好】LeetCode 删除并获得点数
  • c#委托、lambda、事件
  • 每日一练——9×9乘法表
  • 大白话解析LevelDB:ShardedLRUCache
  • GDOI2024游记
  • 学编程怎么样才能更快入手,编程怎么简单易学
  • Android 通知--判断通知是否有跳转
  • 【计算机网络】IO多路转接之poll
  • 性能比较:in和exists
  • 【Java设计模式】五、建造者模式
  • nginx代理minio教程 避坑过的教程 避开SignatureDoesNotMatch
  • Linux进程详细介绍
  • 2024年3月产品认证基础考试简答题及答案
  • 嵌入式蓝桥杯做题总结
  • Spring Boot 常用注解大全
  • (MATLAB)第十二章-数列与极限
  • OJ输入问题+准备
  • 软考高级:主动攻击和被动攻击概念和例题
  • cuda python torch 虚拟环境配置
  • 激光炸弹 刷题笔记
  • Vue3学习记录(三)--- 组合式API之生命周期和模板引用
  • Batch Normalization和Layer Normalization和Group normalization
  • 命名实体识别NER(综合代码示例)
  • 关于jQuery日历插件:daterangepicker