【前端】-【前端文件操作与文件上传】-【前端接受后端传输文件指南】
目录
- 前端文件操作与文件上传
- 前端接受后端传输文件指南
前端文件操作与文件上传
一、前端文件上传有两种思路:
- 二进制blob传输:典型案例是formData传输,相当于用formData搭载二进制的blob传给后端
- base64传输:转为base64传输,后端再将base64转回来。简便、耗时
二、与文件相关的对象
- files:通过input标签读过来的文件对象,是blob的子类。
- blob:不可变的二进制内容,包含很多操作方法,切片上传、断点续传都是基于blob的
- formData:用于后端传输的对象。files是一个前端的对象,不能直接传给后端,所以我们需要一个前后端都认可的载体来传递文件,这个载体就是formData。formData就像一辆汽车用来搭载files,这样才能让文件以二进制的形式传到后端
- fileReader:多用于把文件读取为某种形式(如base64、text文件)直接传给后端
三、file参数、blob切割文件、FileReader将文件转成base64,浓缩图/文本预览:
<template><div><input type="file" name="file" @change="fileChange" /><!-- 缩略图,文本预览 --><img style="width:200px;" :src="imgbase64" /><button @click="submit">提交</button></div>
</template><script>
import axios from "axios"
import { fstat } from "fs";
let _fileObj;
export default {name: 'HelloWorld',data() {return {imgbase64: "",}},methods: {fileChange(e) {let file = e.target.files[0]// files是个数组_fileObj = file;// file常用属性:size(大小)、type(类型)、name(文件名)if (file.size > 10 * 24 * 24) {alert("文件不能大于十兆")}if (file.type !== 'video/mp4') {alert("必须是mp4")}// 使用blob的slice方法可以切割文件let _sliceBlob = new Blob([file]).slice(0, 5000);// 切割二进制的0-5000位// 将切割后的Blob对象转成File对象(第二个参数是文件名),之后就可以上传切割后的File对象let _sliceFile = new File([_sliceBlob], "test.png");//将File对象或者Blob对象转成base64或textlet fr = new FileReader();fr.readAsDataURL(_sliceFile);// readAsDataURL是转成base64的方法let self = this;fr.onload = function () {// base64是异步的转换,通过onload方法获得转换结果self.imgbase64 = fr.result// 直接将转换结果赋值给img的src,设置src的大小即可获得浓缩图console.log(fr.result)// 打印结果见下图一}},async submit() {// 这部分的代码后面讲let _formData = new FormData();_formData.append("user", "asdasd");_formData.append("file", _fileObj)axios.post("/xx", _formData);}}}
}
</script>

四、formData:不仅可以搭载文件,还可以搭载文字、input的其他输入
<form action="xxx" method="post">默认情况下提交为query参数</from>
<form action="xxx" method="post" enctype="multipart/form-data">enctype指定提交为formData</from>
五、文件上传:将blob转成FormData上传
async submit() {let _formData = new FormData();_formData.append("user", "asdasd");_formData.append("file", _fileObj)axios.post("/xx", _formData);
}
通过查看网络可以发现:
- 上传内容:

- 请求头content-Type指定了传输内容为form-data,且boundary指定了分割符

- 分隔了两个内容(下面还有一个分割线,即以分割线结尾)

六、转换关系

- 我们直接拿到的是file对象,file对象可以转换成Blob对象,Blob对象也可以转成file对象
- file、blob都可以根据FileReader读成base64或text文本
- 通过接口传输给后端时,只能传输base64、text文本、formData,所以,如果不把file、blob通过FileReader读成base64或text文本,那么就需要把file或者blob append到formData才能通过接口传输
七、具体功能
- 单文件上传(详见前述代码)
- 多文件上传:
<template><div><input type="file" name="file" @change="fileChange" multiple /><span v-for="item in imgList">{{ item.name }}</span><button @click="submit">提交</button></div>
</template><script>
import axios from "axios"
import { fstat } from "fs";
let _fileObj;
export default {name: 'HelloWorld',data() {return {imgList: [],}},methods: {fileChange(e) {//多文件上传// multiple的多文件上传其实很不友好,需要用户在选择文件时按住ctrl多选,否则就会变成单选// 所以使用imgList数组将用户每次选择的内容都push进去if (e.target.files.length > 1) {this.imgList.concat(e.target.files)} else {this.imgList.push(e.target.files[0]);}//切片上传_fileObj = e.target.files[0]},async submit() {// 遍历,一个一个上传this.imgList.forEach((item) => {let _formData = new FormData();_formData.append(item.name + "file", item)axios.post("/xx", _formData);})}}
}
</script>
- 切片上传
<template><div><input type="file" name="file" @change="fileChange" multiple /><div>{{ precent }}%</div><button @click="submit">提交</button></div>
</template><script>
import axios from "axios"
import { fstat } from "fs";
let _fileObj;
export default {name: 'HelloWorld',data() {return {precent: 0}},methods: {fileChange(e) {//切片上传,在上传的时候进行切片,文件改变时只赋值_fileObj = e.target.files[0]},async submit() {let size = 2 * 1024 * 1024;// 每次切片的大小,片为2mlet fileSize = _fileObj.size;let current = 0;// 当前已经传了多少// 断点续传,永久记录中断的地方,下次上传时直接从断点开始传//localStorage.setItem(_fileObj.name, current);while (current < fileSize) {let _formData = new FormData();_formData.append(_fileObj.name, _fileObj.slice(current, current + size))await axios.post("http://localhost:4000/upload",_formData)// 进度条可以用axios的onUploadProgress方法,且发送切片时可以并行发送请求,后续可以自行优化this.precent = Math.min((current / fileSize) * 100, 100)current += size;}}}
}
</script>
File System Access API 允许直接读取、写入或保存对用户设备上的文件和文件夹的更改。从 Chrome 86 开始支持 File System Access API,目前只有基于 Chromium 系列的浏览器全面支持,Safari 部分支持(支持读取,不支持写入和保存),而 Firefox 未支持。
前端接受后端传输文件指南
相关文章:
【前端】-【前端文件操作与文件上传】-【前端接受后端传输文件指南】
目录 前端文件操作与文件上传前端接受后端传输文件指南 前端文件操作与文件上传 一、前端文件上传有两种思路: 二进制blob传输:典型案例是formData传输,相当于用formData搭载二进制的blob传给后端base64传输:转为base64传输&…...
【IC前端虚拟项目】验证环境env与base_teat思路与编写
【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 上一篇里解决了最难搞的axi_ram_model,接下来呢就会简单又常规一些了,比如这一篇要说的env和base_test的搭建。在这里我用了gen_uvm_tb脚本: 【前端验证】验证自动化脚本的最后一块拼图补全——gen_t…...
使用Remix部署智能合约到币安链(Remix的操作介绍 币安链合约的部署) 点赞收藏哦
大家好,我是程序员大猩猩呀。 据我所知,很多人进入币圈之后,想要通过炒币一夜暴富!另一部分人呢他们希望自己能创建一个项目,然后发行自己的数字货币然后暴富。 不管是什么方式吧,只要不违法,…...
为什么Redis6.0引入了多线程
Redis 6.0引入了多线程,主要原因有以下几点: 提高网络I/O的吞吐量:多线程可以更有效地处理大量的并发连接和请求,特别是在多核心服务器上。通过使用多线程来处理读写网络套接字,Redis能够更充分地利用系统资源&#x…...
速盾:高防ip和高防cdn有什么相同点?
高防IP(Dedicated IP)和高防CDN(Content Delivery Network)都是用来保护网站免受各种网络攻击的技术手段,它们在一定程度上具有相同的作用和效果。下面将详细介绍它们的相同点。 首先,高防IP和高防CDN都能…...
设计模式之拦截过滤器模式
想象一下,在你的Java应用里,每个请求就像一场冒险旅程,途中需要经过层层安检和特殊处理。这时候,拦截过滤器模式就化身为你最可靠的特工团队,悄无声息地为每一个请求保驾护航,确保它们安全、高效地到达目的…...
【联通支付注册/登录安全分析报告】
联通支付注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨…...
c++ - 在循环中使用迭代器删除 unordered_set 中的元素
标签 c unordered-set 请考虑以下代码: Class MyClass 为自定义类:class MyClass { public:MyClass(int v) : Val(v) {}int Val; };然后下面的代码将在调用 it T.erase(it); 之后在循环中导致 Debug Assertion Failed: unordered_set<MyClass*> T; unordered_set<…...
深入了解哈希映射(HashMap)
一、哈希映射(HashMap)简介 在计算机科学中,哈希映射(HashMap)是一种基于键值对(Key-Value pair)存储数据的数据结构,它提供了高效的数据查找、插入和删除操作。哈希映射的核心思想…...
Public Key Retrieval is not allowed
Public Key Retrieval is not allowed 最近使用 JDBC 连接 MySQL 频繁出现如下报错: java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowe 这段代码是一个 Java 异常错误信息,其中包含了以下关键信息: 错误类…...
iphone进入恢复模式怎么退出?分享2种退出办法!
iPhone手机莫名其妙的进入到了恢复模式,或者是某些原因需要手机进入恢复模式,但是之后我们不知道如何退出恢复模式怎么办? 通常iPhone进入恢复模式的常见原因主要是软件问题、系统升级失败、误操作问题等导致。那iphone进入恢复模式怎么退出&…...
Leetcode 107:二叉树的层次遍历II
给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)。 思路:翻转title102的结果即可。 //层次遍历二叉树public static List<List<Integ…...
LNMP一键安装包
LNMP一键安装包是什么? LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian/Deepin/Alibaba/Amazon/Mint/Oracle/Rocky/Alma/Kali/UOS/银河麒麟/openEuler/Anolis OS Linux VPS或独立主机安装LNMP(Nginx/MySQL/PHP)、LNMPA(Nginx/MySQ…...
[机器学习-05] Scikit-Learn机器学习工具包进阶指南:协方差估计和交叉分解功能实战【2024最新】
🎩 欢迎来到技术探索的奇幻世界👨💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…...
多线程的情况下 AopContext.currentProxy()切面代理失效问题
多线程的情况下 AopContext.currentProxy()切面代理失效问题 在多线程环境下,AopContext.currentProxy() 可能会遇到问题,特别是在某些情况下,它无法正确地获取到当前线程的代理对象。这通常发生在以下几种情况: 线程不是由Spri…...
https://是怎么实现的?
默认的网站建设好后都是http访问模式,这种模式对于纯内容类型的网站来说,没有什么问题,但如果受到中间网络劫持会让网站轻易的跳转钓鱼网站,为避免这种情况下发生,所以传统的网站改为https协议,这种协议自己…...
Linux无root配置Node,安装nvm
1. 安装NVM: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash # 或者,如果你使用wget wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 对于bash用户,可以运行&…...
蛋糕店做配送小程序的作用是什么
蛋糕烘焙除了生日需要,对喜吃之人来说往往复购率较高,除线下实体店经营外,更多的商家选择线上多种方式获客转化、持续提高生意营收,而除了进驻第三方平台外,构建品牌私域自营店铺也同样重要。 运用【雨科】平台搭建蛋…...
重写muduo之TcpServer
目录 1、Callbacks.h 2、TcpServer.h 3、TcpServer.cc 1、Callbacks.h 回调操作 #pragma once#include <memory> #include <functional>class Buffer; class TcpConnection;using TcpConnectionPtrstd::shared_ptr<TcpConnection>; using ConnectionCall…...
腾讯云服务器之ssh远程连接登录及转发映射端口实现内网穿透(实现服务器访问本地电脑端口)
目录 一、创建密钥绑定实例二、设置私钥权限三、ssh远程连接到服务器四、修改root密码五、端口转发(实现服务器访问本地电脑的端口) 一、创建密钥绑定实例 创建密钥会自动下载一个私钥,把这个私钥复制到c盘 二、设置私钥权限 1、删除所有用户…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
