码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 分片上传与断点续传


    分片上传与断点续传

    Github仓库完整代码

    效果

    请添加图片描述

    采用在线编辑 cloudstudio

    初始化

    • npm i init
    • npm i express
    • npm i express-fileupload
    • npm i axios
    • npm i crypto-js

    为何断点续传

    • 浏览器对文件大小限制
    • 上传失败后重新传送
    • 中断传送后再次传送

    实现思路

    前端

    1. 拿到文件,对文件进行读取操作
    function read(file){
    
      const reader=new FileReader()
      return new Promise(((resolve, reject) => {
        reader.onload=function (){ // 读取成功返回
          resolve(reader.result)
        }
        reader.onerror=reject // 失败返回
        reader.readAsBinaryString(file) // 返回读取的字符串
      }))
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. MD5加密
      const hash=CryptoJS.MD5(content)
    
    • 1
    1. 对文件进行分片操作
     while (uploaded<size){
        const chunk=file.slice(uploaded,uploaded+chunkSize,type) // file继承自blod,blod有方法slice,可对文件进行切片处理
        const formData=new FormData()
        formData.append('name',name)
        formData.append('type',type)
        formData.append('size',size)
        formData.append('hash',hash)
        formData.append('file',chunk)
        formData.append('offset',uploaded)
        formData.append('index',index)
        axiosArr.push(formData)
        index+=1
        uploaded +=chunk.size
    
    
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 判断这个文件是否上传过(也就是上传到一半中止了)
      const local=localStorage.getItem(hash)
    
    • 1
    1. 从当前地方继续上传
    const newDoneArr=[]
        isDoneArr.map((item,index)=>{
          if(item===0){
            newDoneArr.push(axiosArr[index])
          }
        })
        progress.max=newDoneArr.length-1
        progress.value=0
        multiRequest(newDoneArr,1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 开始上传,加入待上传队列中
    function enqueue(queue=[],url){
        const len=queue.push(url)  // 加入队列中
        request(queue,url) // 请求开始
        return len
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 请求成功,修改状态数据
    	const result=await axios.post('/api/upload',formData)
        const i=urlsClone.indexOf(formData) // 上传的是哪个文件
        const hash=formData.get('hash') // 拿到hash标识
        localStorage.setItem(hash,i)// 保存上传的状态
        result[i]=formData
        isDoneArr[i]=1 // 修改状态数据为完成
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 判定是否上传完成
    function dequeue(queue=[],formData){
        progress.value += 1 // 当前上传到哪了
        queue.splice(queue.indexOf(formData),1) // 从queue中移除已完成请求
        if(uls.length){ // 如果还有未上传文件,继续上传
          enqueue(queue,uls.shift())
        }else { // 上传完成给出提示
          if(isDoneArr.indexOf(0)===-1){
            output.innerText='上传成功'
            progress.value=urlsClone.length
            localStorage.removeItem(formData.get('hash'))
          }
        }
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    后端

    1. 利用FS模块向文件中写入数据
    2. 先解析出文件名
    const {name, type, size, offset, hash,index} = req.body
    
    • 1
    1. 写入文件
     await appendFile(filename, file.data) 
    
    • 1
  • 相关阅读:
    树与图的深度优先遍历:AcWing 846. 树的重心
    Java实现图片上传功能(前后端:vue+springBoot)
    TypeScript学习日志-第三十二天(infer关键字)
    LeaRun.Java工作流引擎 快速开发业务流程
    sqlite3 是一个命令行工具,用于与 SQLite 数据库进行交互和管理
    Java从控制台接收用户输入的一行英文句子,把句子的最前面两个单词移到句子的最后面去,并整理句子的大小写及标点符号,将新的句子输出
    AOC新特性发布会之事件中心
    Linux的网络命令
    [go学习笔记.第十四章.协程和管道] 1.协程的引入,调度模型以及运行cpu数目,协程资源竞争问题
    关于github申请学生认证-卡在证明上传环节解决方案
  • 原文地址:https://blog.csdn.net/weixin_64925940/article/details/125457266
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号