前端--文件上传--文件切片--利用FileReader()中的readAsDataURL()做缩略图--多文件上传--formData--切片上传实现

news2024/10/5 21:13:29

一、文件上传

<template>
  <div>
    <input type="file" name="file" @change="fileChange" />
    <button @click="submit">提交</button>
  </div>
</template>

<script setup>

function fileChange(e) {
  // e.target.files[0]表示获取到索引为0的文件
  let file = e.target.files[0];
  console.log(file);
  if (file.size > 1024 * 1024 * 10) {
    alert("文件大小不能超过10M");
    return;
  }
  if (file.type !== "video/mp4") {
    alert("文件类型必须是mp4");
    return;
  }
}
function submit() {}
</script>

在这里插入图片描述
可以把File 类型 转换为 Blob 类型,因为 File 是Blob的子类
在这里插入图片描述

console.log(new Blob([file]));

在这里插入图片描述

二、文件切片(利用Blob中的slice()方法 )

在这里插入图片描述

三、FileReader()的使用

Blob是不可修改也是无法读取里面的内容的。但是Filereader就提供了读取Blob里面内容的方法。

1.做缩略图用readAsDataURL

<template>
  <div>
    <input type="file" name="file" @change="fileChange" />
    <button @click="submit">提交</button>
  </div>
</template>

<script setup>

function fileChange(e) {
  // e.target.files[0]表示获取到索引为0的文件
  let file = e.target.files[0];
  let fr = new FileReader();
  // 做缩略图用readAsDataURL
  fr.readAsDataURL(file);
  //fr 读取完成后执行
  fr.onload = () => {
    console.log(fr.result);
  }
}
function submit() {}
</script>

在这里插入图片描述
给图片显示一下
在这里插入图片描述
在这里插入图片描述
可以利用切片来实现上传半张图片的效果
在这里插入图片描述
在这里插入图片描述

2. 也可以做文本预览(利用readAsText)方式和上面的步骤差不多。

四、多文件上传(给input添加multiple 属性)

前端最常见的就是添加一个multiple 属性,这样在上传的时候只要按住Ctrl 就可以选择多个文件了,这样的方式对用户不够友好,因为有些用户是不知道按住Ctrl 可以选择多个文件的,一般来说,用户只会一个文件,一个文件来上传的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用户不按Ctrl 来选择多个文件,而是一个一个文件上传 就需要我们自己来收集数据了。一般定义一个数组来接收,看下面动图就是符合用户习惯的
在这里插入图片描述
在这里插入图片描述

五、文件传给后端的方式

图片可以通过转成Base64 的方式,文件一般使用 formData来进行传输,可以说,formData 就是一个载体,负责装载文件

在这里插入图片描述

<template>
  <div>
    <input type="file" name="file" @change="fileChange" multiple/>
    <button @click="submit">提交</button>
    <div v-for="item in imgList" >{{ item.name }}</div>
  </div>
</template>

<script setup>
import axios from 'axios'
import { ref } from 'vue'

const imgbase64 = ref('');
const imgList = ref([]) //多文件上传
// 定义全局变量,用来存储文件对象
// 方便后面的submit方法使用
let _fileObj;

function fileChange(e) {
  //多文件上传
  //结合 multiple属性,可以上传多个文件,
  //但需要按住ctrl键来选择多个文件,不符合用户习惯
  let files = e.target.files;
  console.log(files);
  _fileObj = files;
  // 如果用户使用ctrl键选择多个文件,需要用concat合并
  if (e.target.files.length > 1) {
    imgList.value.concat(e.target.files)
    //用户一个一个选择文件,直接push存储起来,符合用户习惯
  } else {
    imgList.value.push(e.target.files[0])
  }

}
function submit() {
  // 文件要传递给后端的话,必须需要用FormData。
  // 图片可以直接用base64传递
  let _formData = new FormData();
  _formData.append('user', '张三');
  _formData.append('file', _fileObj);
  axios.post('/XXX',_formData)
}
</script>

在这里插入图片描述
在这里插入图片描述
上面是提交单个文件的,如果想要提交多个文件,只需要遍历即可
把 下面的

 let _formData = new FormData();
  _formData.append('user', '张三');
  _formData.append('file', _fileObj);
  axios.post('/XXX', _formData)

改成

  //多文件上传,遍历数组,每个文件都要用FormData包装一下
   imgList.value.forEach((item) => {
    let _formData = new FormData();
    _formData.append(item.name + 'file', item);
    axios.post('/XXX',_formData)
  })

六、切片上传具体实现

<template>
  <div>
    <input type="file" name="file" @change="fileChange" multiple />
    <div>{{ Percentage }}%</div>
    <button @click="submit">提交</button>
    <div v-for="item in imgList">{{ item.name }}</div>
  </div>
</template>

<script setup>
import axios from "axios";
import { ref } from "vue";

const imgbase64 = ref("");
const imgList = ref([]); //多文件上传
const Percentage = ref(0); //上传进度

// 定义全局变量,用来存储文件对象
// 方便后面的submit方法使用
let _fileObj;

function fileChange(e) {
  // 切片上传
  _fileObj = e.target.files[0];
}

async function submit() {
  let size = 2 * 1024 * 1024; //每片2M
  let fileSize = _fileObj.size;
  let current = 0;
  while (current < fileSize) {
    let _formData = new FormData();
    let fileData =  _formData.append(_fileObj.name, _fileObj.slice(current, current + size));
    // 这个接口只是用来测试,只有一个功能,就是返回一个‘ok’
    await axios.post('http://localhost:4000/upload', fileData)
    Percentage.value = (current / fileSize * 100)//进度条计算
    current += size;
  }
  Percentage.value=100
}
</script>

在这里插入图片描述
server.js文件用来模拟文件上传的,需要引入包:

npm i koa koa-cors koa-router
const Koa = require('koa');
const cors = require('koa-cors');
const koarouter = require('koa-router');
const router = new koarouter();
const app = new Koa();
app.use(cors());

router.post('/upload', async (ctx, next) => {
  ctx.body ='ok'
})

router.post('/upload', async (ctx, next) => {
  ctx.body ='ok'
})

app.use(router.routes());
app.listen(4000);

启动服务器:

node  server.js 

演示效果
在这里插入图片描述

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

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

相关文章

ROS开发之如何制作launch启动文件?

文章目录0、引言1、Launch文件语法2、Launch示例0、引言 笔者因研究课题涉及ROS开发&#xff0c;学习了古月居出品的ROS入门21讲&#xff0c;为巩固launch的知识&#xff0c;本文将ROS的launch启动文件制作一讲内容进行总结。launch文件通过XML文件实现多节点的配置和启动&…

Compose (11/N) - 手势

一、点击 1.1 可点击 Modifier.clickable( ) 允许应用检测对该元素的点击。 Composable fun ClickableSample() {val count remember { mutableStateOf(0) }Text(text count.value.toString(),modifier Modifier.clickable { count.value 1 }) } 1.2 手势检测 Modifier.p…

【技术分享】接口自动化测试中,如何做断言验证?

在服务端自动化测试过程中&#xff0c;发起请求之后还需要对响应值进行验证。验证响应信息符合预期值之后&#xff0c;这一条接口自动化测试用例才算完整的通过。所以这一章节&#xff0c;将会讲解在接口自动化测试中&#xff0c;如何对服务端返回的响应内容做断言验证。 实战…

C语言函数大全-- i 开头的函数

C语言函数大全 本篇介绍C语言函数大全– i 开头的函数 1. imagesize 1.1 函数说明 函数声明函数功能unsigned imagesize(int left, int top, int right, int bottom);获取保存位图像所需的字节数 1.2 演示示例 #include <graphics.h> #include <stdlib.h> #in…

【Java数据结构】链表OJ提交小记

目录 1.删除链表中所有值为val的节点 2.反转单链表 3.返回链表的中间节点 4.返回链表倒数第k个节点 5.按次序合并链表 6.按值分割链表 7.判断链表是否为回文 1.删除链表中所有值为val的节点 1. 删除链表中所有值为val的节点https://leetcode.cn/problems/remove…

考研数据结构-绪论

绪论 文章目录绪论1. 什么是数据结构2. 基本概念数据结构的四类基本结构&#xff08;逻辑结构&#xff09;存储结构顺序存储和链式存储比较分析3. 算法概念特征优点&#xff08;也是要求&#xff09;算法效率的度量概念时间复杂度空间复杂度(了解)1. 什么是数据结构 数据结构是…

【Python】字符串 ⑦ ( input 字符串输入 | input 函数自带提示参数 | input 函数接收的变量类型 )

文章目录一、input 字符串输入二、代码示例三、input 函数自带提示参数四、input 函数接收的变量类型一、input 字符串输入 在命令行中 , 使用 printf 可以输出数据 , 将 变量 , 字面量 , 表达式 输出到命令行中 ; 在命令行中 , 使用 input 语句可以 在 命令行 中 , 从键盘获取…

2023年第五届传智杯前四题题解(后俩没写出来)

比赛链接&#xff1a;第五届“传智杯”全国大学生计算机大赛&#xff08;决赛B组&#xff09; - 比赛详情 - 洛谷 时效「月岩笠的诅咒」 题目背景 蓬莱之药&#xff0c;被诅咒的不死之药。 奉命将蓬莱之药投入富士山中销毁的月岩笠&#xff0c;最终打算把蓬莱之药改投入八岳销…

STM32Cube的debug和release切换

一&#xff0c; Debug / Release版本区别 来源&#xff1a;STM32CUBEIDE中 Debug 和 Release 的作用/区别/使用场景 - svchao - 博客园 (cnblogs.com) 二&#xff0c;Debug / Release使用。 1&#xff0c;在编译的时候可以选择Debug 还是 Release . 2,使用stm32CubeIDE调试或运…

【模型复现】resnet,使用net.add_module()的方法构建模型。小小的改进大大的影响,何大神思路很奇妙,基础很扎实

从经验来看&#xff0c;网络的深度对模型的性能至关重要&#xff0c;当增加网络层数后&#xff0c;网络可以进行更加复杂的特征模式的提取&#xff0c;所以当模型更深时理论上可以取得更好的结果。但是更深的网络其性能一定会更好吗&#xff1f;实验发现深度网络出现了退化问题…

Git的安装与基本使用

Git是一个分布式版本控制工具&#xff0c;可以快速高效地处理从小型到大型的各种项目。 1.Git的安装 官网下载地址 &#xff1a;https://git-scm.com/ 安装过程 选择 Git 安装位置&#xff0c;要求是非中文并且没有空格的目录&#xff0c;然后下一步。 Git 选项配置&#xf…

ChatGPT搭建语音智能助手

环境 python&#xff1a;3 ffmpeg:用于处理视频和语音 gradio:UI界面和读取语音 概述 我们的目的是做一个语音智能助手 下面我们开始 准备工作 下载Visual Studio Code Visual Studio Code 因为需要写python代码&#xff0c;用Visual Studio Code比较方便。 安装pytho…

( “树” 之 DFS) 101. 对称二叉树 ——【Leetcode每日一题】

101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示&#xff1a…

webgl-画任意多边形

注意&#xff1a; let canvas document.getElementById(webgl) canvas.width window.innerWidth canvas.height window.innerHeight let radio window.innerWidth/window.innerHeight; let ctx canvas.getContext(webgl) 由于屏幕长宽像素不一样&#xff0c;导致了长宽像素…

移远云服务QuecCloud正式发布,一站式为全球客户提供创新有效的解决方案

4月12日&#xff0c;在“万物智联共数未来”移远通信物联网生态大会上&#xff0c;移远通信宣布正式推出其物联网云服务——QuecCloud。QuecCloud具备智能硬件开发、物联网开放平台、行业解决方案三大能力&#xff0c;可为开发者和企业用户提供从硬件接入到软件应用的全流程解决…

Java 进阶(5) Java IO流

⼀、File类 概念&#xff1a;代表物理盘符中的⼀个⽂件或者⽂件夹。 常见方法&#xff1a; 方法名 描述 createNewFile() 创建⼀个新文件。 mkdir() 创建⼀个新⽬录。 delete() 删除⽂件或空⽬录。 exists() 判断File对象所对象所代表的对象是否存在。 getAbsolute…

4.2 方差

学习目标&#xff1a; 我认为学习方差需要以下几个步骤&#xff1a; 确定学习目标&#xff1a;在开始学习方差之前&#xff0c;需要明确学习的目标和意义&#xff0c;例如&#xff0c;理解方差的定义、掌握方差的计算方法、了解方差在实际问题中的应用等。 学习相关数学概念&…

宝塔Linux面板安装命令脚本大全(Centos/Ubuntu/Debian/Fedora/Deepin)

宝塔面板Linux服务器操作系统安装命令大全&#xff0c;包括Centos、Alibaba Cloud Linux、Ubuntu、TencentOS Server、Deepin、Debian和Fedora安装脚本&#xff0c;云服务器吧分享宝塔面板Linux服务器系统安装命令大全&#xff1a; 目录 宝塔面板Linux系统安装命令 Centos安…

【Vue】学习笔记-事件处理

事件的基本用法 使用v-on:xxx 或xxx 绑定事件&#xff0c;其中xxx是事件名事件的回调需要配置在methods对象中&#xff0c;最终会在vm上methods中配置的函数&#xff0c;不要用箭头函数&#xff0c;否则this就不是vm了methods中配置的函数&#xff0c;都是被vue所管理的函数。…

Pandas库:从入门到应用(三)——多表连接操作

一 、concat数据连接 1.1、concat()函数参数 pd.concat(objs, axis0, joinouter, ignore indexFalse, keysNone, levelsNone, namesNoneverify integrityFalse, sort False, copyTrue)objs&#xff1a;多个 DataFrame 或者 Series axis&#xff1a;0-行拼接 1-列拼接 join&am…