文件分片(代码片段)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="file" name="文件上传" id="fileBtn">
    <script src="https://cdn.bootcdn.net/ajax/libs/spark-md5/3.0.2/spark-md5.min.js"></script>
    <script>
        const fileChunkSize = 10 * 1024 * 1024 //10MB
        const fileInput = document.getElementById('fileBtn')
        fileInput.onchange = async (e) => {
            //获取到文件
            const file = e.target.files[0]
            if (!file) {
                return
            }
            //获取文件分片
            const chunks = createChunk(file, fileChunkSize)
            //计算hash (可用Web Workers 计算)
            const result = await hash(chunks)
            console.log(result)
        }

        //创建切片
        function createChunk(file, chunkSize) {
            const reslut = []
            for (let i = 0; i < file.size; i += chunkSize) {
                reslut.push(file.slice(i, i + chunkSize))
            }
            return reslut
        }

        //计算md5值
        function hash(chunks) {
            return new Promise(resolve => {
                const spark = new SparkMD5()
                function _read(i) {
                    if (i >= chunks.length) {
                        //spark.end() 结束
                        resolve(spark.end())
                        return
                    }
                    //单个分片
                    const blob = chunks[i]
                    //创建FileReader对象
                    const reader = new FileReader()
                    //来自于MDN介绍
                    //FileReader 接口的 readAsArrayBuffer() 方法用于开始读取指定 Blob 或 File 的内容。当读取操作完成时,
                    //readyState 属性变为 DONE,并触发 loadend 事件。此时,result 属性包含一个表示文件数据的 ArrayBuffer。
                    reader.readAsArrayBuffer(blob)
                    reader.onload = e => {
                        const bytes = e.target.result //读取到的字节
                        //来自于https://github.com/satazor/js-spark-md5
                        //加入到其中计算
                        spark.append(bytes)
                        _read(i + 1)
                    }
                }
                _read(0)
            })
        }
    </script>
</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值