吃透前端文件上传与文件相关操作

最近在学文件上传的操作,所以想把学习到东西写成一文章
这片文章是我以小白视角 慢慢学习并熟悉前端文件相关操作的流程总结出来的
前端文件上传 我首先想到是

<input type="file">选择文件</input>

如果我们想限制上传文件的格式,大小或进行裁剪分片上传
##如何对文件上传进行操作呢
查阅mdn文档 发现三个可用于type=“file”的属性
accept 文件上传控件中预期文件类型的提示
capture 文件上传控件中媒体捕获方法的提示

  • capture="camera":用户将直接进入摄像头捕获界面,可以拍摄照片或录制视频。
  • capture="user":用户将进入相册,可以从相册中选JJ择照片或视频。
    multiple 布尔值。是否允许多个值 默认为false
<input type="file" accept="image/*" multiple>选择文件</input>

额。。。。。。好像并没有解决问题
换另一个办法,可以使用 File 对象的属性

<input type="file" id="fileInput" ></input><script>const fileInput = document.getElementById('fileInput');fileInput.addEventListener('change', function(event) {const file = event.target.files[0];console.log('文件名:', file.name);console.log('文件大小:', file.size);console.log('文件类型:', file.type);});</script>

这次获取到可以操作对象的属性
这下可以实现一些简单的需求 比如约束文件格式,约束文件大小

 if(file.size > 10 * 1024 *1024){alert('不能超过10M')}if(file.type !=='image/jpeg'){alert('必须为jpeg图片')}

那么如何实现文件内容的操作呢

想要操作文件的内容 先获取文件的内容

如何读取文件内容

JS中提供了API。可以使用 FileReader对象读取文件内容,然后进行处理。,常见的转换方法包括readAsText()readAsDataURL(),readAsArrayBuffer()
如何使用

  • 如果需要将文件内容解析为文本形式,可以使用 readAsText(file)
  • 如果需要处理文件的二进制数据,可以使用 readAsArrayBuffer(file)
  • 如果需要在页面中显示文件内容或生成可用于展示的 URL,可以使用 readAsDataURL(file)
const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function(event) {
const file = event.target.files[0]const reader = new FileReader();//解析成 Base64reader.readAsDataURL(file);JJreader.onload = function(e) {const fileContent = e.target.result;
//const fileContent= reader.result;console.log('文件内容:', fileContent);};});

前端给后端传输文件的格式

前端给后端的文件一般都是二进制blob传输或base64传输格式,前端给后端上传文件
那么什么是blob对象呢
Blob对象是用来表示二进制数据的一个接口,可以存储大量的二进制数据
mdn上解释
要从其他非 blob 对象和数据构造一个 Blob,请使用 Blob 构造函数。要创建一个 blob 数据的子集 blob,请使用 slice() 方法。
语法 new Blob(array, options)
File对象
new File()
new File(bits, name[, options])
bits一个包含ArrayBuffer,ArrayBufferView,Blob,或者 DOMString 对象的Array — 或者任何这些对象的组合。这是 UTF-8 编码的文件内容。

现在可以运用了解的知识 可以做一个缩略图了用vue实现下

<template>
<input type="file" name="file" @change="fileChange">选择文件</input>
<img :src="imgbase64" style="width:800px"/>
</template>
<script setup>
const imgbase64 = ref()
const fileChange = (e:any) => {
//这最好做个浅拷贝 直接在原对象上面操作不好
let file = e.target.file
let _sliceBlob = new Blob([__file]).slice(0,5000)
let _sliceFile = new File([_sliceBlob],"text.jpeg")
let fr = new FileReader()
// 转换成base64
fr.readAsDataURL(_sliceFile)
fr.onload = function(){
imgbase64.value = fr.result
}
}
</script>

如何上传到后端
查询mdn
FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式,本接口和此方法都相当简单直接。如果送出时的编码类型被设为 "multipart/form-data",它会使用和表单一样的格式。
你可以使用FormData.append来添加键/值对到表单里面

Submitbtn.addEventListener('click',() => {let _formData = new FormData()let data = _formData.append(_file.name+'file',_file)axios.post("/xx",data)})

接下来代码用Vue实现 基础文件上传操作已经完成 接下来是些小功能
如何实现多文件上传
正常方案应该是直接在input里面加入multiple

<input type="file" multiple></input>

这样就可以直接ctrl+鼠标左键就可以多选 但明显不符合日常多文件上传的习惯 有些人喜欢一个一个选 而且需要把多文件上传的名字 “两个文件” 改成 两个文件各自名字好些
接下来实现一波 无非就是定义一个数组,将之前的值存里面

<template><input type="file" name="file" @change="fileChange" multiple >选择文件</input><span v-for="item in imgList" :key="item">{{item.name}} </span><button @click="sumbit">文件按钮</button></template>
<script setup lang="ts">
import { ref } from 'vue';
const imgList = ref([])
let file = e.target.files[0]__file = filee.target.files.length > 1 ? imgList.value.push(...e.target.files) : imgList.value.push(e.target.files[0])	const sumbit =async () => {imgList.value.forEach((item) => {let _formData = new FormData()console.log(item)let data = _formData.append(item.name + 'file',item)axios.post("/xx",data)})
</script>

多文件上传就实现了
在这里插入图片描述

有些时候上传文件过大,为了加快效率可以使用且切片上传

大文件切片上传


//可以做进度条
let precent = ref(0)
const sumbit =async () => {let allSize = __file.sizelet size = 1 * 1024 * 1024let current = 0 ;while(current < allSize){const formData = new FormData()let data = formData.append(__file.name,__file.slice(current,current + size))axios.post("/xxxx",data)precent.value = Math.min((current/allSize),100)current += size}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024审计师报名流程图解❗报名时间汇总❗

2024年审计专业技术资格考试报名正在进行中 &#x1f50d;审计报名流程 一、考生注册 打开浏览器登录中国人事考试网进行【考生注册】&#xff0c;按照提示认真填写个人注册信息&#xff0c;确保个人信息真实、完整、准确&#xff0c;并上传已处理好的照片。 二、考生报名 1⃣考…

[C++核心编程-09]----C++类和对象之继承

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

C++进阶:哈希(1)

目录 1. 简介unordered_set与unordered_map2. 哈希表&#xff08;散列&#xff09;2.1 哈希表的引入2.2 闭散列的除留余数法2.2.1 前置知识补充与描述2.2.2 闭散列哈希表实现 2.3 开散列的哈希桶2.3.1 结构描述2.3.2 开散列哈希桶实现2.3.3 哈希桶的迭代器与key值处理仿函数 3.…

7B2 PRO主题5.4.2 免授权开心版源码 | WordPress主题

简介&#xff1a; B2 PRO 5.4.2 最新免授权版不再需要改hosts&#xff0c;和正版一样上传安装就可以激活。 直接在WordPress上传安装即可 点击下载

信息化总体架构方法_1.信息化的一般概念

通常&#xff0c;信息化包含了七个主要平台&#xff1a;知识管理平台、日常办公平台、信息集成平台、信息发布平台、协同工作平台、公文流转平台和企业通信平台。 1.信息化的一般概念 1&#xff09;信息化 “信息化是指培育、发展以智能化工具为代表的新的生产力并使之造福于…

RSA非对称加密解密,前端公钥加密后端私钥解密

RSA非对称加密解密&#xff0c;前端公钥加密后端私钥解密&#xff0c;可以防止陌生人直接通过后端接口篡改数据。有数据泄露的风险。 前端&#xff1a;Vue框架 后端&#xff1a;sprintboot&#xff08;Java&#xff09; 工具类&#xff1a;hutool 前端Vue获取公钥&#xff1a…

巴奴火锅翻车,杜中兵后悔暗讽海底捞

曾经喊出“服务不过度&#xff0c;样样都讲究”、内涵海底捞的巴奴火锅&#xff0c;又改回了2012年的广告语&#xff0c;试图重回“产品主义”。 巴奴火锅于2001年创立于河南安阳&#xff0c;彼时被视作火锅界的黑马。巴奴火锅创始人的杜中兵&#xff0c;坚信“产品主义”一定…

基于SpringBoot + Vue的学生宿舍课管理系统设计与实现+毕业论文(15000字)+开题报告

系统介绍 本系统包含管理员、宿管员、学生三个角色。 管理员&#xff1a;管理宿管员、管理学生、修改密码、维护个人信息。 宿管员&#xff1a;管理公寓资产、管理缴费信息、管理公共场所清理信息、管理日常事务信息、审核学生床位安排信息。 学生&#xff1a;查看公共场所清理…

【C++】 string类:应用与实践

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

ASP.NET Web Api 如何使用 Swagger 管理 API

前言 Swagger 是一个开源的框架&#xff0c;支持 OpenAPI 规范&#xff0c;可以根据 API 规范自动生成美观的、易于浏览的 API 文档页面&#xff0c;包括请求参数、响应示例等信息&#xff0c;并且&#xff0c;Swagger UI 提供了一个交互式的界面&#xff0c;可以帮助我们快速…

Java——多线程

一.多线程 1.什么是多线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程的实际运作单位 简单理解多线程就是应用软件中相互独立&#xff0c;可以同时运行的功能(也可以理解为人体内相互独立&#xff0c;但可以同时运行的器官⌓‿⌓) 我们…

如何用时尚新姿讲好中国品牌故事?

品牌建设在推动高质量发展中扮演了双重角色&#xff0c;既是高质量发展的重要“承载者”&#xff0c;也是强有力的“助推器”。5月10日-11日&#xff0c;中国时尚品牌URBAN REVIVO&#xff08;以下简称UR&#xff09;以中国品牌日为起点&#xff0c;联合天猫超级品牌日&#xf…

Linux提权--SUDO(CVE-2021-3156)Polkit(CVE-2021-4034)

免责声明:本文仅做技术学习与交流... 目录 SUDO(CVE-2021-3156) 影响版本 -判断&#xff1a; -利用&#xff1a; Polkit(CVE-2021-4034&#xff09; ​ -判断&#xff1a; -利用: 添加用户 SUDO(CVE-2021-3156) another: SUDO权限配置不当. 影响版本 由系统的内核和发…

Redis 5.0 Stream数据结构深入分析

Redis 5.0 Stream数据结构深入分析 目录 Redis 5.0 Stream数据结构深入分析 一、Stream数据结构概述 二、核心概念解析 三、Stream的特性与用途 四、案例研究&#xff1a;实时消息系统 五、性能优化与最佳实践 六、总结与展望 一、Stream数据结构概述 Redis Stream是Red…

FastAPI - Tortoise ORM 数据库基础操作

文章目录 1. 安装 Tortoise ORM2. 定义模型3. 初始化数据库连接4. 数据库操作4.1 创建数据4.2 查询数据4.3 更新数据4.4 删除数据 5. 使用 Pydantic 模型6. 关闭数据库连接7. fields类相关操作1. fields.IntField2. fields.BigIntField3. fields.SmallIntField4. fields.CharFi…

【LAMMPS学习】八、基础知识(6.3)使用 LAMMPS GUI

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各种模拟。 …

西门子博途WINCC动画之旋转运动

概述 本例将介绍在西门子 TIA Portal HMI 中旋转运动动画的一种实现方法。本例以风机、搅拌器和传送带为例&#xff0c;按下启动按钮开始转动&#xff0c;按下停止按钮停止转动。 第1步&#xff1a; 添加 PLC 设备。​博途TIA/WINCC社区VX群 ​博途TIA/WINCC社区VX群 选择西…

PyQt5中的QGraphicsView()

文章目录 1. 简介2. 一个简单的示例2. 加载一幅图片3. 常用方法示例 1. 简介 QGraphicsView是PyQt5中用于显示图形场景的小部件&#xff0c;它提供了许多常用的方法来控制视图的行为和属性。下面是一些常用的QGraphicsView方法&#xff1a; setScene(scene): 设置要显示的场景…

从零开始写 Docker(十四)---重构:实现容器间 rootfs 隔离

本文为从零开始写 Docker 系列第十四篇&#xff0c;实现容器间的 rootfs 隔离&#xff0c;使得多个容器间互不影响。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; 核心原理&#xff1a;…

SpringCloud 集成 RocketMQ 及配置解析

文章目录 前言一、SpringCloud 集成 RocketMQ1. pom 依赖2. yml 配置3. 操作实体4. 生产消息4.1. 自动发送消息4.2. 手动发送消息 5. 消费消息 二、配置解析1. spring.cloud.stream.function.definition 前言 定义 Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力…