首页 > 其他分享 >js实现分片上传

js实现分片上传

时间:2023-10-09 16:15:51浏览次数:34  
标签:const chunkSize js result file 分片 chunks hash 上传

代码贴过来就能用

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
http-equiv="X-UA-Compatible"
content="IE=edge"
/>
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
/>
<title>Document</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/spark-md5/3.0.2/spark-md5.min.js"></script>
</head>
<body>
<input
type="file"
name=""
id=""
/>
<script>
const inp = document.querySelector("input");
inp.addEventListener("change", async function (e) {
const file = inp.files[0];
//没有拿到file对象
if (!file) {
return;
}
//调用工具函数
let chunks = createChunks(file, 1 * 1024 * 1024); //1M 每次分割1M就切割一次
// console.log("chunks", chunks);
const result = await hash(chunks);
console.log("result", result); //拿到当前文件的hash值
});

/**
* 工具函数,用来保存每个切片唯一id
*
*/
function hash(chunks) {
//将hash函数改为异步函数,读取数据需要时间
return new Promise((resolve) => {
//创建md5实例
const spark = new SparkMD5();
//使用递归(读第几个分块)
function _read(i) {
//判断是否已经读完
if (i >= chunks.length) {
resolve(spark.end()); //全部读完结束结束得到一个hash
return;
}
//未读完情况
const blob = chunks[i];
//读取文件
const reader = new FileReader();
//由于读取文件是异步的,可以用
reader.onload = (e) => {
const bytes = e.target.result; //拿到读取到的字节数组
spark.append(bytes); //把一组字节加到运算中
_read(i + 1); //递归调用
};
//读取文件字节数
reader.readAsArrayBuffer(blob); //传入分块
}
//从第一个分块开始读
_read(0);
});
}

/***
* 工具函数
* 参数一:file对象
* 参数二:切片大小
*/
function createChunks(file, chunkSize) {
console.log("chunkSize", chunkSize);
const result = []; // 创建数组获取每一个切片
//循环
for (let i = 0; i < file.size; i += chunkSize) {
// const piece = file.slice(0, 99); //取该文件的0-99字节,返回一个Blob类型对象
result.push(file.slice(i, i + chunkSize));
}
return result;
}
</script>
</body>
</html>

 

参考文章:http://blog.ncmem.com/wordpress/2023/10/09/js%e5%ae%9e%e7%8e%b0%e5%88%86%e7%89%87%e4%b8%8a%e4%bc%a0/

欢迎入群一起讨论

 

 

标签:const,chunkSize,js,result,file,分片,chunks,hash,上传
From: https://www.cnblogs.com/songsu/p/17751986.html

相关文章

  • c# json操作
    使用JavaScriptSerializer需要在引用中添加System.Web.ExtensionsusingSystem.Web.Script.Serialization;classUpdateInfo{publicstringpackageUrl;publicstringremoteManifestUrl;publicstringremoteVersionUrl;publicstringversion;pu......
  • js实现电子白板
    功能:使用画笔绘制笔迹(线条)、橡皮檫 <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>js实......
  • 原生js面试题
    一、深拷贝和浅拷贝-1js的数据类型基本类型和复杂类型-2堆和栈基本类型的值和复杂类型的地址存在栈中,复杂类型的地址指向堆中的内存-3深拷贝和浅拷贝的概念深拷贝的前提是复杂类型的复制-4举例说明 如果有个变量a和一个变量b如果a是一个对象......
  • 泛微OA e-office平台uploadify.php任意文件上传漏洞
    0x01漏洞描述泛微e-office系统是标准、易用、快速部署上线的专业协同OA软件,国内协同OA办公领域领导品牌,致力于为企业用户提供专业OA办公系统、移动OA应用等协同OA整体解决方案。泛微OAe-office平台uploadify.php处存在任意文件上传漏洞,攻击者通过漏洞可以获取服务器权限。 ......
  • js实现文件分片上传
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>文件分片上传</title></head&......
  • js函数,js对象
    1定义一个函数21.functionfuctionName(参数1,参数2){3//要执行的代码4return要返回的结果5}6782.varfunctionName=function(a,b)91011ES6箭头函数:(...)=>{...}12arr.forEach((e)=>{13console.log(e);14})基础对象模......
  • WebForm后端调用前端JS
    /*注意:定义的js方法一定要放在head里面,不能放下面,否则不生效*/<%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="WebForm1.aspx.cs"Inherits="WebFormBackEndCallFrontJsDemo.WebForm1"%><!DOCTYPEhtml><htmlxmlns=&qu......
  • js实现分片上传文件
    <template><div><inputtype="file"@change="fileEvent"/></div></template><script>importaxiosfrom"axios";exportdefault{data(){return{size:1*......
  • 【webapp】jsp EL 的基本语法和用法
    EL(表达式语言)是用于在JSP页面中访问和操作数据的简洁表达式语言。EL提供了一种简化和统一的方式来访问变量、属性、集合和其他对象。以下是EL的基本语法和用法:基本语法:${expression}:用于在JSP页面中嵌入EL表达式。${object.property}:访问对象的属性。${map.key}:访......
  • 【webapp】jsp 操作数据库
    在JSP中连接和操作数据库需要使用Java的JDBC(JavaDatabaseConnectivity)API。下面是学习在JSP中使用JDBC连接和操作数据库的基本步骤:导入JDBC驱动程序:下载并导入适合您所使用的数据库的JDBC驱动程序JAR文件。不同的数据库有不同的驱动程序。将JDBC驱动程......