程序员逸尘 2023-10-22 16:42 采纳率: 100%
浏览 9
已结题

关于vue3前端文件分片的问题!

在实现分片上传的时候前端发送不到后端
我的后端

img

img

在测试也可以,也就是后端没啥问题

img

我的前端是用来vue3和element-plus的一个组件的el-upload


<template>
<el-upload
      drag
      action
      :auto-upload="false" 
      :show-file-list="false" 
      :on-change="changeFile"
      >
    <el-icon class="el-icon--upload"><upload-filled /></el-icon>
    <div class="el-upload__text">
      Drop file here or <em>click to upload</em>
    </div>
    <template #tip>
      <div class="el-upload__tip">
        jpg/png files with a size less than 500kb
      </div>
    </template>
  </el-upload>
</template>

<script setup >
import { UploadFilled } from '@element-plus/icons-vue'
import SparkMD5 from "spark-md5";
import { uploadAPI } from '@/apis/upload';
import { ref } from 'vue';
import  {getFileMd5}  from '@/utils/spark'

//选择文件后调用
const changeFile = async (uploadFile, uploadFiles) => {
// 1.文件信息
    let fileRaw = uploadFile.raw
    let fileName = fileRaw.name
    console.log(uploadFile)
// 2.获取 文件的 MD5唯一标识码
  let fileMd5 = null
  try {
    fileMd5 = await getFileMd5(fileRaw)
    console.log(fileMd5)
  } catch (e) {
    console.error('[error]', e)
  }
  if (!fileMd5) return
    // 每片的大小为 5M 可调整
    const chunkSize = 5 * 1024 * 1024
    
    // 3.文件分片储存
      let chunkList = []
      //函数定义: chunkPush 是一个函数,它接受一个参数 page,其默认值为1。这个函数负责将文件分割成块并将这些块添加到 chunkList 数组中。
      //const chunkPush=(page = 1) =>
        function chunkPush(page = 1) {
    //文件分割: 使用 fileRaw.slice() 代码来从文件中提取一个块。page 参数表示当前的页码(或者块号),chunkSize 是每个块的字节大小。
    //0~5M
        chunkList.push(fileRaw.slice((page - 1) * chunkSize, page * chunkSize))
          //如果文件当前的序列没有到文件大小,就继续分割
          //先不考虑正好
          if (page * chunkSize < fileRaw.size) {
               console.log('添加切片:', chunkList) // 在每次添加切片后打印当前切片列表  
            chunkPush(page + 1)
          }
        }
        //递归
        chunkPush()
        saveFileChunk(chunkList, fileMd5, fileName)
        
    }
    // 4.保存文件片段到后台
const saveFileChunk = async (chunkList, fileMd5, fileName) => {
  for(let i = 1; i < chunkList.length+1; i++) {
    let formData = new FormData()
    formData.append('slice', chunkList[i]) // 当前分片的文件流
    formData.append('sliceNo', i)
    formData.append('totalSliceNo', chunkList.length) // 共有多少分片
    formData.append('fileMd5', fileMd5) // 整个文件的MD5唯一标识码,不是分片
    // formData.append('name', fileName) // 文件的名称
    // formData.append('size', chunkList[i].size) // 当前切片的大小(最后一片不一定是5M)
    
    console.log(formData)
    
    const save =async (formData)=>{
        const { slice, fileMd5 ,sliceNo,totalSliceNo} = formData
        const res= await uploadAPI( { slice, fileMd5 ,sliceNo,totalSliceNo} )
        console.log(res)
    }
    save(formData)
 
    

    
  }
}


</script>

前端api是

img

img


那为什么还是爆

img


大概是slice有问题,但是这为什么错。
atction改了

img


但是

img

img

  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2023-10-22 16:51
    关注

    接口服务控制台报错了,参数传的有问题,看下是哪个参数异常了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月23日
  • 已采纳回答 10月23日
  • 赞助了问题酬金50元 10月23日
  • 创建了问题 10月22日