首页 > 其他分享 >原生JS上传大文件分片

原生JS上传大文件分片

时间:2023-11-14 13:46:44浏览次数:36  
标签:文件 const formData JS file 分片 上传

上传大文件分片是一种常见的上传方式,可以有效地避免上传过程中出现网络中断等问题导致的上传失败。下面是一个使用原生JS实现上传大文件分片的示例代码:

 

javascript 
// 定义上传文件的分片大小 
const CHUNK_SIZE = 1024 * 1024; // 1MB 
 
// 获取文件的MD5值 
function getFileMD5(file) { 
  return new Promise((resolve, reject) => { 
    const reader = new FileReader(); 
    reader.onload = () => { 
      const spark = new SparkMD5.ArrayBuffer(); 
      spark.append(reader.result); 
      const md5 = spark.end(); 
      resolve(md5); 
    }; 
    reader.onerror = reject; 
    reader.readAsArrayBuffer(file); 
  }); 
} 
 
// 分片上传文件 
async function uploadFile(file) { 
  const fileSize = file.size; 
  const fileMD5 = await getFileMD5(file); 
  const totalChunks = Math.ceil(fileSize / CHUNK_SIZE); 
  let uploadedChunks = 0; 
  let uploadedSize = 0; 
  while (uploadedChunks < totalChunks) { 
    const start = uploadedChunks * CHUNK_SIZE; 
    const end = Math.min(start + CHUNK_SIZE, fileSize); 
    const chunk = file.slice(start, end); 
    const formData = new FormData(); 
    formData.append('file', chunk); 
    formData.append('fileMD5', fileMD5); 
    formData.append('chunkIndex', uploadedChunks); 
    formData.append('totalChunks', totalChunks); 
    const response = await fetch('/upload', { 
      method: 'POST', 
      body: formData, 
    }); 
    const result = await response.json(); 
    if (result.success) { 
      uploadedChunks++; 
      uploadedSize += chunk.size; 
      const progress = Math.floor((uploadedSize / fileSize) * 100); 
      console.log(`Uploaded ${progress}%`); 
    } else { 
      console.error(result.message); 
    } 
  } 
  console.log('Upload complete!'); 
} 

 

上述代码中,我们首先定义了上传文件的分片大小为1MB,然后使用SparkMD5库计算文件的MD5值。接着,我们根据文件大小和分片大小计算出需要上传的总分片数,并在循环中逐个上传每个分片。在上传每个分片时,我们使用FormData对象将分片数据和其他参数一起发送到服务器端。上传成功后,我们更新已上传的分片数和已上传的文件大小,并计算上传进度。最后,当所有分片上传完成时,我们输出上传完成的消息。

 

需要注意的是,上述代码中的上传接口地址为`/upload`,需要根据实际情况进行修改。另外,由于分片上传涉及到文件的MD5值计算和网络请求等操作,因此建议使用异步函数或Promise等方式进行处理,以避免阻塞UI线程。

 

参考文章:http://blog.ncmem.com/wordpress/2023/11/14/%e5%8e%9f%e7%94%9fjs%e4%b8%8a%e4%bc%a0%e5%a4%a7%e6%96%87%e4%bb%b6%e5%88%86%e7%89%87-2/

欢迎入群一起讨论

 

 

标签:文件,const,formData,JS,file,分片,上传
From: https://www.cnblogs.com/songsu/p/17831415.html

相关文章

  • VSCode 中 Json 文件介绍
    VisualStudioCode官方文档1.Json配置文件EditingJSONwithVisualStudioCodesettings.json分类defaultsettings.json:只读格式,相当于官方的参考文档;settings.json:自定义形式,优先级大于默认的settings.json文件,ctrl+shift+o查看默认提供的格式,而后自定......
  • js:React中使用classnames实现按照条件将类名连接起来
    参考文档https://www.npmjs.com/package/classnameshttps://github.com/JedWatson/classnames安装npminstallclassnames示例importclassNamesfrom"classnames";//字符串合并console.log(classNames("foo","bar"));//foobar//对象合并console.lo......
  • js:可选链运算符(?.)和空值合并运算符(??)
    文档:可选链运算符(?.)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Optional_chaining空值合并运算符(??)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing目录1、可选链运算符(?.)2、空值合并运算......
  • 基于React使用swiperjs实现竖向滚动自动轮播
    很多文章,都只提供了js部分,包括官方的文档也只有js部分,如果css设置不正确,会导致轮播图不自动播放。使用的swiper版本:v11.0.3文档https://swiperjs.com/get-startedhttps://swiperjs.com/react实现效果使用vite创建react应用pnpmcreatevitereact-app--templatereact完整依赖pac......
  • PHP大文件分割分片上传实现代码
    这篇文章主要介绍了PHP大文件分割分片上传实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关upload_max_filesize=2M//PHP最大能接受的文件大小post_max_s......
  • js运行机制
    区分进程和线程线程和进程区分不清,是很多新手都会犯的错误,没有关系。这很正常。先看看下面这个形象的比喻:进程是一个工厂,工厂有它的独立资源工厂之间相互独立线程是工厂中的工人,多个工人协作完成任务工厂内有一个或多个工人工人之间共享空间再完善完善概念:工......
  • vuejs3.0 从入门到精通——Pinia——Store 是什么?
    Pinia——Store是什么?https://pinia.vuejs.org/zh/getting-started.html#what-is-a-store一、Store是什么? Store(如Pinia)是一个保存状态和业务逻辑的实体,它并不与你的组件树绑定。换句话说,它承载着全局状态。它有点像一个永远存在的组件,每个组件都可以读取和写入它。......
  • 软件测试|使用selenium实现文件上传
    简介文件上传是我们web自动化测试工作中经常使用的场景,selenium同样也是支持我们实现自动化的文件上传操作,本文就来给大家介绍一下selenium如何实现自动化文件上传。input标签文件上传一般情况下,文件上传的按钮是一个<input>标签,并且附带的type属性为file,这样的标签我们可以使用sen......
  • js实现大文件分片上传
    简单的实现一个分片上传//设置分片大小(大小根据需求调整)constCHUNK_SIZE=1024*1024;//1MB//选择文件并切割成分片constfileInput=document.getElementById('file-input');constchunks=[];letcurrentChunkIndex=0;fileInput.addEventListener('change',hand......
  • js---判断用户是否在浏览当前页面
    最近遇到一个需求,需要判断用户是否在当前页面,只有用户在当前页面才可以播放视频,如果切换到其他窗口就要将视频暂停掉,避免学生刷课程,以下是具体的代码:<scripttype="text/javascript"src="js/jquery-1.8.3.min.js"></script><scripttype="text/javascript">varindex=0,ti......