大文件切片上传

<template>
    <div>
      <input type="file" @change="handleFileChange" />
      <button @click="uploadFile">上传</button>
    </div>
  </template>
   
  <script>
  import CryptoJS from 'crypto-js';
  import axios from 'axios';
   
  export default {
    data() {
      return {
        file: null,
        chunkSize: 1024 * 1024, // 每个分片的大小,这里以1MB为例
      };
    },
    methods: {
      handleFileChange(e) {
        this.file = e.target.files[0];                                                                     //获取文件流
      },
      async uploadFile() {
        if (!this.file) {
          alert('请选择文件');
          return;
        }
   
        const fileSize = this.file.size;
        const chunkCount = Math.ceil(fileSize / this.chunkSize);                                            //计算大小
   
        const fileChunks = [];
        for (let i = 0; i < chunkCount; i++) {                                                              //切片
          const chunk = this.file.slice(i * this.chunkSize, (i + 1) * this.chunkSize);
          const encryptedChunk = await this.encryptChunk(chunk);                                            //加密 用的下边写好的encryptChunk方法
          fileChunks.push(encryptedChunk);
        }
   
        const promises = fileChunks.map((chunk, index) => {                                                 //上传 此处 处理成了Promise方便下边的并发上传
          const formData = new FormData();
          formData.append('file', chunk);
          formData.append('fileName', this.file.name);
          formData.append('chunkIndex', index);
          return axios.post('/upload', formData, {
            headers: {
              'Content-Type': 'multipart/form-data',
            },
          });
        });
   
        try {
          await Promise.all(promises);
          alert('上传成功');
        } catch (error) {
          alert('上传失败');
        }
      },
      encryptChunk(chunk) {
        return new Promise((resolve) => {
          const reader = new FileReader();
          reader.onload = (e) => {
            const encryptedChunk = CryptoJS.AES.encrypt(e.target.result, 'your-secret-key');
            const blob = new Blob([encryptedChunk.toString()]);
            resolve(blob);
          };
          reader.readAsArrayBuffer(chunk);
        });
      },
    },
  };
  </script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值