当前端在开发过程中遇到上传文件需求,如果是上传头像、图片小文件之类的,可以正常按上传流程处理。但是当遇到上传大文件需求时,几个G或者十几个G,那么需要将这么大的文件分割成许多小片段分别上传,这种实现思路称为分片上传。

实现分片上传,精髓就是将文件分割成小片段,此时我们需要用到FormData对象和Bolb对象。

核心代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style> </style>
</head>
<body>
<input type="file" name="file" id="file">
<button id="upload" onClick="upload()">上传</button>
<script>
//设置每个切片大小
let bytesPerPiece = 1024*1024
//上传文件函数
function upload(){
//获取上传文件
let file = document.getElementById('file').files[0];
let start = 0, end, index = 0, filesize = file.size, name = file.name;
//计算切片总数
let totalPieces = Math.ceil(filesize/bytesPerPiece);
while(start < totalPieces){
end = start + bytesPerPiece;
if(end > filesize){
end = filesize
}
let chunk = file.slice(start, end);
let formData = new FormData();
formData.append('file', chunk, filename);
//原生js发请求
// let xhr = new XMLHttpRequest();
// xhr.onreadystatechange = function(){
// if(this.readyState == 4 && this.status == 200){ // }
// }
// xhr.open('post', '/api/upload', true);
// xhr.send(formData);
// 使用jquery,需要将contentType,processData设置为false
// $.ajax({
// url: '/api/upload',
// type: 'post',
// data: formData,
// processData: false,
// contentType: false
// }).success(res=>{ // }).error(err=>{ // })
}
}
</script>
</body>
</html>

附加: 断点续传

理解:断点续传,就是在我们上传过程中由于意外原因断网断电情况让上传终止了,那么上传的是不完整的,我们需要向服务器查询一下相同名字的文件大小,然后将上传位置设置成这个大小即可。

最新文章

  1. paip.为什么使用多线程的原因.
  2. Android 使用Parcelable序列化对象
  3. 《转》常用Petri网模拟软件工具简介
  4. Rsync+sersync文件实时同步
  5. Windows 下搭建LDAP服务器
  6. xargs的- n1参数
  7. FreeMarker 乱码解决方案 生成静态html文件
  8. (原)STL中vector的疑问
  9. php中strstr、strrchr、substr、stristr四个函数用法区别
  10. JS添加节点方法与JQuery添加节点方法的比较及总结
  11. spring.NET的依赖注入
  12. 在js中如何得到上传文件的大小。
  13. 【树莓派】Linux应用相关:自动删除n天前日志
  14. javaWeb学习总结(8)- jsp指令(3)
  15. FZU 2253 salty fish
  16. luogu P5323 [BJOI2019]光线
  17. wpgcms---循环导航
  18. LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏。
  19. 测试--错误java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=select], {ExactMatcher:fDisplayName=select(com.rjj.demo.DemoApplicationTests)]...
  20. 设置span在div中垂直居中

热门文章

  1. c++ sizeof详解
  2. php ajax跨域问题解决方案
  3. chrome 检查更新时出错:无法启动更新检查(错误代码为 4: 0xA0430817 -- system level)
  4. Document.createEvent与new Event区别
  5. python 通过win32com操作vcf到outlook中,同时解决乱码问题
  6. C++ Gui Qt4 第二章
  7. supervisord and pm2 进程守护工具
  8. webpack和source map
  9. Delphi 新语法:泛型
  10. qt vnc 远程左桌面