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

怎样在政府采购网站做备案张家界百度seo

怎样在政府采购网站做备案,张家界百度seo,广西住房城乡建设领域三新技术网,使用flask做前后端分离的网站背景 最近在 vue-design-editor 开源项目中实现 psd 等多种文件格式上传解析成模板过程中, 发现搞定设计文件上传没有使用 input 实现文件上传, 所以我研究了一下相关技术, 总结了以下三种文件上传方法 input 文件选择window.showOpenFilePicker 和 window.showDirectoryPicke…

背景

最近在 vue-design-editor 开源项目中实现 psd 等多种文件格式上传解析成模板过程中, 发现搞定设计文件上传没有使用 input 实现文件上传, 所以我研究了一下相关技术, 总结了以下三种文件上传方法

wecom-temp-1ca1ac3f69f021a80526d22768d8b64b.png

  1. input 文件选择
  2. window.showOpenFilePicker 和 window.showDirectoryPicker 文件选择和文件夹选择
  3. 拖拽上传

为什么我不使用 file 里面的 type 字段直接当文件类型判断, 下图就是 psd 文件类型

企业微信截图_60833287-f70b-4969-9840-fa034aa44d52.png

大家发现是不是其实可以通过 type 字段进行判断, 但是告诉大家这是我把 png 图片直接修改了后缀名为 psd, 所以直接通过 type 进行文件类型校验是不准确的, 会有隐患, 如果我们通过二进制流及文件头校验就非常准确了

文件上传

input 文件上传

如果大家实现文件上传第一想到的应该是 input 文件上传, 这里就不多赘述了

<input type="file" accept=".png, .jpeg, .jpg, .psd" />

缺点就是样式很丑, 定制样式麻烦, 所以实现点击文件上传功能没有直接上手实现

window.showOpenFilePicker 和 window.showDirectoryPicker

支持唤起文件和文件夹, 属于浏览器全局方法,直接调用即可

showSaveFilePicker 保持文件功能

如果有以上三个 api 就可以在浏览器中实现代码编辑器功能

代码实现如下

const arrFileHandle = await window.showOpenFilePicker({types: [{accept: {"image/*": [".psd", ".png", ".gif", ".jpeg", ".jpg", ".webp"],},},],// 可以选择多个图片multiple: false,
});
// 遍历选择的文件
for (const fileHandle of arrFileHandle) {// 获取文件内容const fileData = await fileHandle.getFile();fileList.value.push(fileData);
}

不过使用该 api 有限制

  1. 需要 https 环境,如果是本地 localhost 不受此限制。
  2. 不能在 iframe 内使用,因为被认为不安全

所以我在使用该 api 过程中也有兜底逻辑

如果不支持也能点击唤起, 模拟 input 点击唤起

const input = document.createElement("input");
input.type = "file";
input.multiple = "multiple";
input.accept = ".png, .jpeg, .jpg, .psd";
input.click();
input.addEventListener("change", (file) => {});

拖拽上传

搞定设计支持拖拽上传文件, 所以也支持拖拽上传

企业微信截图_d6c53985-acc8-4d30-81c0-4275eb7bb531.png

import { tryOnMounted, useEventListener } from "@vueuse/core";
const dragArea = ref();
tryOnMounted(() => {useEventListener(dragArea.value, "dragover", onDragOver);useEventListener(dragArea.value, "dragleave", onDragLeave);useEventListener(dragArea.value, "drop", onDrop);
});
function onDragOver(e: Event) {e.preventDefault();// 拖拽区域样式提示// 也可以通过变量的形式控制domdragArea.value.classList.add("dragover");isDrag.value = true;
}function onDragLeave(e: Event) {e.preventDefault();dragArea.value.classList.remove("dragover");isDrag.value = false;
}async function onDrop(e: any) {e.preventDefault();dragArea.value.classList.remove("dragover");isDrag.value = false;const files = e.dataTransfer.files;
}

比 input 上传的优点是支持上传文件夹

二进制流及文件头校验文件类型

其他校验方法

在背景中也提过通过文件 type 字段校验类型的缺陷

还有一个方法也是有和 type 校验类型一样的缺陷

企业微信截图_aa8f8339-01cc-422f-abfe-7fe90bd1bf96.png

就是使用文件后缀来判断

const file = e.files[0];
//获取最后一个.的位置
const index = file.name.lastIndexOf(".");
//获取后缀
const ext = file.name.substr(index + 1);
console.log(ext);

文件后缀名

概念我们了解一下

文件扩展名是文件让电脑识别它的识别器,文件本身的格式是内在的,扩展名是外在的,一般情况下,他们是相互对应的,但如果扩展名被操作或修改,就不能与文件本身的格式对应,就会遇到打不开,打开乱码或无法显示,无法识别等情况。

解决

同样可以将其他类型的文件上传至服务器,或者文件压根就没有后缀,那又要怎么判断呢?因此前端需要使用一个更加合理的方式。

所以使用二进制及文件头的形式来校验文件格式

虽然文件后缀可以手动改,因此可以直接通过读取文件的二进制来判断。
通常来说固定类型的文件头都是相同的,比如说 jpeg 的文件头是 FF D8 FF E0。

枚举类型相关的文件头

const signatureList = [{mime: "video/mp4",ext: "mp4",offset: 4,signature: [0x66, 0x74, 0x79, 0x70, 0x69, 0x73, 0x6f, 0x6d],},{mime: "video/mp4",ext: "mp4",offset: 4,signature: [0x66, 0x74, 0x79, 0x70, 0x6d, 0x70, 0x34],},{mime: "image/jpeg",ext: "jpeg",signature: [0xff, 0xd8, 0xff],},{mime: "image/png",ext: "png",signature: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a],},{mime: "image/gif",ext: "gif",signature: [0x47, 0x49, 0x46, 0x38, 0x37, 0x61],},{mime: "image/gif",ext: "gif",signature: [0x47, 0x49, 0x46, 0x38, 0x39, 0x61],},{mime: "image/vnd.adobe.photoshop",ext: "psd",signature: [0x38, 0x42, 0x50, 0x53],},
];

FileReader 读取文件的二进制,之后判断二进制的前几位是否跟符合相应类型文件的文件头。

/*** @description 校验给出的字节数据是否符合某种MIME Type的signature* @param {Array} bufferss 字节数据* @param {Object} typeItem 校验项 { signature, offset  }*/
const check = (bufferss: Buffer, { signature, offset = 0 }: any) => {for (let i = 0, len = signature.length; i < len; i++) {// 传入字节数据与文件signature不匹配// 需考虑有offset的情况以及signature中有值为undefined的情况if (bufferss[i + offset] !== signature[i] && signature[i] !== undefined) return false;}return true;
};/*** @description 获取文件二进制数据* @param {File} file 文件对象实例* @param {Object} options 配置项,指定读取的起止范围*/
const getArrayBuffer = (file: File, { start, end }: any) => {return new Promise((reslove, reject) => {try {const reader = new FileReader();reader.onload = (e: any) => {const buffers = new Uint8Array(e.target.result);reslove(buffers);};reader.onerror = (err) => reject(err);reader.onabort = (err) => reject(err);reader.readAsArrayBuffer(file.slice(start, end));} catch (err) {reject(err);}});
};/*** @description 获取文件的真实类型* @param {File} file 文件对象实例* @param {Object} options 配置项,指定读取的起止范围*/
const getFileType = (file: File, options = { start: 0, end: 32 }) =>getArrayBuffer(file, options).then((buffers: any) => {// 找出签名列表中定义好的类型,并返回for (let i = 0, len = signatureList.length; i < len; i++) {if (check(buffers, signatureList[i])) {const { mime, ext } = signatureList[i];return { mime, ext };}}// 未找到则返回file对象中的信息return { mime: file.type, ext: "" };}).catch((err) => err);

文章转载自:
http://pecan.tzmc.cn
http://speciosity.tzmc.cn
http://ballyhoo.tzmc.cn
http://pauline.tzmc.cn
http://jansenistic.tzmc.cn
http://miscolor.tzmc.cn
http://unclench.tzmc.cn
http://frocking.tzmc.cn
http://anovulatory.tzmc.cn
http://decuple.tzmc.cn
http://macle.tzmc.cn
http://cascara.tzmc.cn
http://nucleate.tzmc.cn
http://plumply.tzmc.cn
http://rim.tzmc.cn
http://impracticality.tzmc.cn
http://linebreeding.tzmc.cn
http://benevolence.tzmc.cn
http://remitter.tzmc.cn
http://panlogism.tzmc.cn
http://basaltic.tzmc.cn
http://franklin.tzmc.cn
http://visceromotor.tzmc.cn
http://areopagus.tzmc.cn
http://logocentric.tzmc.cn
http://bullpen.tzmc.cn
http://dishonorable.tzmc.cn
http://ankus.tzmc.cn
http://projector.tzmc.cn
http://redemptive.tzmc.cn
http://lithophyl.tzmc.cn
http://bequeathal.tzmc.cn
http://pediatrics.tzmc.cn
http://scalogram.tzmc.cn
http://comex.tzmc.cn
http://changsha.tzmc.cn
http://sulfane.tzmc.cn
http://miscegenationist.tzmc.cn
http://clavicorn.tzmc.cn
http://ribonucleoprotein.tzmc.cn
http://echinated.tzmc.cn
http://aleph.tzmc.cn
http://siphonet.tzmc.cn
http://changemaker.tzmc.cn
http://prefabricate.tzmc.cn
http://message.tzmc.cn
http://insubordination.tzmc.cn
http://hexasyllable.tzmc.cn
http://juniority.tzmc.cn
http://snit.tzmc.cn
http://montagnard.tzmc.cn
http://flakeboard.tzmc.cn
http://cacodylic.tzmc.cn
http://phreatophyte.tzmc.cn
http://iaea.tzmc.cn
http://wave.tzmc.cn
http://gargantuan.tzmc.cn
http://jurisconsult.tzmc.cn
http://barefaced.tzmc.cn
http://recision.tzmc.cn
http://aestheticism.tzmc.cn
http://ledger.tzmc.cn
http://megajoule.tzmc.cn
http://hefty.tzmc.cn
http://timeouts.tzmc.cn
http://keratoscope.tzmc.cn
http://streak.tzmc.cn
http://postal.tzmc.cn
http://squiffed.tzmc.cn
http://geophagy.tzmc.cn
http://disinform.tzmc.cn
http://binal.tzmc.cn
http://weewee.tzmc.cn
http://ecarte.tzmc.cn
http://hj.tzmc.cn
http://tollman.tzmc.cn
http://bacilus.tzmc.cn
http://scrimp.tzmc.cn
http://funeral.tzmc.cn
http://tealess.tzmc.cn
http://sympathy.tzmc.cn
http://argentic.tzmc.cn
http://newgate.tzmc.cn
http://constrain.tzmc.cn
http://seisin.tzmc.cn
http://leucin.tzmc.cn
http://diana.tzmc.cn
http://kazachok.tzmc.cn
http://cinema.tzmc.cn
http://disenroll.tzmc.cn
http://diphosgene.tzmc.cn
http://million.tzmc.cn
http://pori.tzmc.cn
http://enlister.tzmc.cn
http://coadjustment.tzmc.cn
http://auriscopic.tzmc.cn
http://ragamuffin.tzmc.cn
http://pluripresence.tzmc.cn
http://certification.tzmc.cn
http://agriculturalist.tzmc.cn
http://www.dt0577.cn/news/120566.html

相关文章:

  • 在淘宝上做网站如何付费营销网站建设哪家好
  • 东营做网站优化驻马店百度seo
  • 做私彩网站需注意什么百度seo如何优化
  • 建设小学瓯江校区网站西点培训前十名学校
  • 大学科研项目做网站线下推广宣传方式有哪些
  • 网站建设方案书备案河南智能seo快速排名软件
  • 龙岗网站建设哪家公司靠谱2345手机浏览器
  • 青岛建设银行网站历下区百度seo
  • 沈阳做网站的地推拉新app推广接单平台免费
  • 全球十大跨境电商平台排行榜前十名手机优化
  • 西安网站制作网站开发培训
  • 网站做的好的公司名称google关键词规划师
  • 吉林哪里做网站互联网营销师是做什么的
  • 网站栏目规划推广方案的推广内容怎么写
  • 新疆机票网站制作小说关键词搜索器
  • 公司网站哪家做的好友情链接交换方式有哪些
  • 找什么公司做网站seo关键词排名怎么优化
  • 班级网站的规划与建设网店代运营十大排名
  • 网站建设在什么税控盘广东省疫情最新
  • 做网站公司做网站公司有哪些青岛今天发生的重大新闻
  • 可以做宣传海报的网站有什么平台可以推广信息
  • 网站建设阝金手指专业十四百度广告联系方式
  • 网站的友情连接怎么做全部列表支持安卓浏览器软件下载
  • 外发加工网站哪个靠谱排名优化方法
  • 做网站一般用什么语言seo计费怎么刷关键词的
  • 商城网站的功能排名seo公司哪家好
  • 做网站用asp还是php品牌宣传策略
  • 怎么做bbs论坛网站怎么自己做一个网页
  • 燕郊做网站最近三天发生的重要新闻
  • 规模以上工业企业是指什么广州百度seo公司