高等JS之大文件分片上传

HTML

    <!-- 大文件分片上传 -->
    <input type="file" id="fileInput">
    <button onclick="upload()">上传</button>

JS

const upload = () => {
    // 获取input元素
    const fileInput = document.getElementById('fileInput');
    // 拿到file对象
    const file = fileInput.files[0]
    console.log(file);
    // 设置分片大小,每片设置1MB
    const chunkSize = 1024 * 1024 
    // 设置开始值
    const start = 0
    // 设置结束值
    const end = Math.min(chunkSize, file.size)
    // 设置分片指针
    const chunkIndex = 0
    // 开始第一次上传
    uploadChunk()

// 定义上传分片函数
    const uploadChunk = () => {
        // 文件切片
        const chunk = file.silce(start, end)
        // 定义formData,用于文件上传
        const formData = new FormData()
        // 文件切片添加
        formData.append('file', chunk)
        // 切片指针添加
        formData.append('chunkIndex', chunkIndex)
        // 切片总次数添加
        formData.append('totalChunks', Math.ceil(file.size / chunkSize))
        // 实际上传的url
        const uploadURL = '/upload-chunk'
        // 向服务端发送post,响应体为formData
        fetch(upload, {
            method: 'post',
            body: formData
        })
        // 获取请求结果
        .then(res => {
            if (res.ok) {
                return res.json()
            }
            throw new Error('上传失败')
        })
        // 每一次分片上传完成后的执行函数
        .then(data => {
            console.log(data);
            console.log(`第${chunkIndex + 1} 片上传成功`);
            // 分片指针加一
            chunkIndex++
            // 起始值等于第一次的结束值
            start = end
            // 第一次的结束值等于第二次的开始值
            end = Math.min(start + chunkSize, file.size)
            // 如果起始值小于文件size,说明未全部上传,则继续上传
            if(start < file.size) {
                uploadChunk()
            }else {
                console.log('全部上传成功');
            }
        })
    }
}

实现手动分片上传的过程涉及将文件分割成多个部分(chunk),然后逐个上传这些部分。这样做的好处是可以提高上传的稳定性和恢复性,尤其是在网络不稳定或大文件情况下。

下面是一个简单的示例,展示如何使用原生JavaScript手动实现文件分片上传的逻辑。这里我们假设分片大小为1MB,你可以根据需要调整这个大小。

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼鱼不让我编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值