vue分片上传

<template>
  <div>
    <input type="file" id="input" />
    <button @click="uploadFile">上传</button>
  </div>
</template>

<script lang="ts" setup>
let chunkSize=1024 * 1024,
    index=0;
const uploadFile=()=>{
  let inp=document.getElementById('input');
  const file=inp.files[0]
  const [fileName,ext] = file.name.split('.')
  let start=index * chunkSize // 切片起始
  if(start>file.size) return

  const blob= file.slice(start,start+chunkSize) // 切片

  const formData=new FormData()
  const blobName=`${fileName}${index}.${ext}` // 拼接片名
  const blobFile=new File([blob],blobName)
  console.log(blobFile)
  formData.append('file', blobFile)

  fetch('/uploadFile',{
    method: 'post',
    body: formData
  }).then(()=>{
    index++;
    uploadFile()
  })
}

</script>

<template>
  <h1>上传</h1>
  <input type="file" @change="onChange" />
</template>

<script setup lang="ts">
import SparkMD5 from "spark-md5";
const spark = new SparkMD5() //创建SparkMD5的实例

const onChange=async (e:any)=>{
  const file=e.currentTarget.files[0] // 获取文件
  const chunks=createChunks(file,2 * 1024 * 1024) // 进行切片blob流
  const result=await hash(chunks,file) // 进行哈希加密得到16位字符
}
// 计算哈希
const hash=(chunks:any,files:any)=>{
  return new Promise(resolve => {
    const _read=(i:number)=>{
      if(i>=chunks.length){
        resolve(spark.end()) // 计算结束
        return // 读取完成
      }
      const blob=chunks[i] // 获取每一项
      const reader=new FileReader() // 解析每一块数据
      reader.readAsArrayBuffer(blob)

      const [fileName,ext] = files.name.split('.')
      const blobName=`${fileName}.${ext}` // 拼接片名
      // 转成File流
      const blobFile=new File([blob],blobName)
      const formData=new FormData() // 后端要的格式
      formData.append('file', blobFile)

     
      reader.onload=e=>{
        const bytes=e.target.result // 读取到的字节数组
        spark.append(bytes)
        fetch('/uploadFile',{
          method: 'post',
          body: formData
        }).then(()=>{
          _read(i+1)
        })
      }
    }
    _read(0)
  })
}


// 切片
const createChunks=(file:any,chunkSize:any)=>{
  const resurl=[]
  for(let i=0;i<file.size;i+=chunkSize){
    resurl.push(file.slice(i,i+chunkSize))
  }
  return resurl
}
</script>


<style scoped>

</style>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值