vue3+antdv实现大文件上传优化

vue3+antdv实现大文件上传优化

一、相关配置下载

选择一种方式下载,npm/yarn都可以

npm i mockjs
npm i axios

二、mock配置

1.创建文件夹src/mock/index.js

2.在main.js中引入

import './mock/index'

3.在mock/index.js中引入

//引入mock模块
import Mock from "mockjs";

// 模拟图片上传接口
Mock.mock('/api/upload', 'post', (options) => {
  // 解析请求参数
  const formData = options.body;

  // 模拟上传操作
  // 模拟返回上传成功的响应
  return Mock.mock({
    code: 200,
    message: '上传成功',
    data: {
      url: '@image',
    },
  });
});
// 设置拦截Ajax请求,生成模拟数据
Mock.setup({
    timeout: '1000', // 设置响应时间范围
});

4.前端代码实现


<template>
    <a-upload :before-upload="beforeUploadOld" :custom-request="customRequestOld" :show-upload-list="false"
        :multiple="true">
        <a-button icon="upload">
            上传
        </a-button>
    </a-upload>
    <a-upload :before-upload="beforeUpload" :custom-request="customRequest" :show-upload-list="false" :multiple="true">
        <a-button icon="upload">
            上传优化
        </a-button>
    </a-upload>
</template>

<script setup>
import axios from 'axios';
import { message } from 'ant-design-vue';

const beforeUpload = (file) => {
    // 在上传之前的操作,例如限制文件大小、类型等
    console.log('before upload:', file);

    return true;
}
const beforeUploadOld = (file) => {
    // 在上传之前的操作,例如限制文件大小、类型等
    console.log('before uploadold:', file);

    return true;
}
const customRequestOld = async (options) => {
    const formData = new FormData()
    formData.append('file', options.file)
    let startTime = performance.now();
    await axios
        .post('/api/upload', formData)
        .then((response) => {
            console.log('Upload success:', response.data);
            message.success('上传成功');
            // 处理上传成功的操作
        })
        .catch((error) => {
            console.error('Upload error:', error);
            message.error('上传失败');
            // 处理上传错误的操作
        });
    let endTime = performance.now();
    let uploadTime = (endTime - startTime); // 转换为秒
    console.log("优化前上传所需时间", uploadTime);
}
const customRequest = async (options) => {
    const file = options.file
    let startTime = performance.now();
    const chunkSize = 1000000 // 每个分片的大小(字节)
    const totalChunks = Math.ceil(file.size / chunkSize)
    const chunkRequests = []
    for (let i = 0; i < totalChunks; i++) {
        const start = i * chunkSize
        const end = start + chunkSize
        const chunk = file.slice(start, end)
        const formData = new FormData()
        formData.append('file', chunk)
        formData.append('chunkIndex', i)
        formData.append('totalChunks', totalChunks)
        const chunkRequest = axios.post('/api/upload', formData)
        chunkRequests.push(chunkRequest)
    }
    axios.all(chunkRequests).then(() => {
        message.success('上传成功');
    }).catch(() => {
        message.error('上传失败');
    })
    let endTime = performance.now();
    let uploadTime = (endTime - startTime); // 转换为秒
    console.log("优化后上传所需时间", uploadTime);
}
</script>
<style scoped lang='less'></style>

customRequest方法接收一个options对象参数,其中包含了file属性,表示需要上传的文件。代码首先定义了每个分片的大小chunkSize,然后计算了需要的总分数totalChunks

接下来使用一个循环来迭代生成每个分片的请求。在每次循环中,我们根据chunkSize和循环索引计算出当前分片的起始和结束位置,并使用file.slice方法切割出当前分片。然后,我们创建一个FormData对象,并通过append方法将filechunkIndextotalChunks添加到表单中。

接下来,我们使用axios.post方法发送分片上传的请求,并将返回的请求对象存储在chunkRequests数组中。

最后,我们使用axios.all方法将所有的分片上传请求一起发送,并通过.then方法注册一个回调函数,在所有分片上传完成后执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用以下步骤来实现Vue3+AntdV+JavaScript的身份证正反面上传功能: 1. 首先,确保你已经安装了Vue3和AntdV,并且已经创建了一个Vue项目。 2. 在你的Vue组件中,引入AntdV的Upload组件和Button组件: ```javascript <template> <div> <a-upload :before-upload="beforeUpload" :show-upload-list="false"> <a-button>选择图片</a-button> </a-upload> </div> </template> <script> import { ref } from 'vue'; export default { setup() { // 创建一个ref来保存上传的图片 const image = ref(''); // 在上传之前的钩子函数中处理文件 const beforeUpload = (file) => { // 使用FileReader读取文件内容 const reader = new FileReader(); reader.onload = (e) => { // 将读取的文件内容赋值给image image.value = e.target.result; }; // 读取文件内容 reader.readAsDataURL(file); // 返回false,阻止默认的上传行为 return false; }; return { beforeUpload, image, }; }, }; </script> ``` 3. 在上面的代码中,我们使用了Vue的`ref`函数来创建一个响应式的数据`image`,用来保存上传的图片。 4. 在`beforeUpload`钩子函数中,我们使用`FileReader`来读取上传的文件内容,并将其赋值给`image`。最后,我们返回`false`来阻止默认的上传行为。 5. 在模板中,我们使用AntdV的`Upload`组件来实现文件上传,并使用`before-upload`属性来绑定`beforeUpload`钩子函数。 6. 最后,你可以根据需要在组件中使用`image`来显示上传的图片。 这样,你就可以实现Vue3+AntdV+JavaScript的身份证正反面上传功能了。记得根据你的实际需求做相应的调整和样式美化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值