JavaScript: Base64 数据分片切割
在网上找了很多 base64 切割分片的方法,都有各种各样的问题,最后结合各种方案和测试,得到一个较为完美的方案,未发现bug:
实现
export default {
    /**
     * @param {string} baseStr - base64 字符
     * @param {number} sizeByte - 分片目标字节大小
     * @returns {string[]} 返回切割后 base64 字符串数组
     */
    split(baseStr, sizeByte) {
        if (!baseStr) return [];
        // 计算base64字符数,确保是4的倍数
        let base64Size = Math.ceil((sizeByte * 4) / 3);
        base64Size = Math.ceil(base64Size / 4) * 4;
        let result = [];
        let matches = baseStr.match(/^data:(.+);base64,(.+)$/);
        let prefix = '';
        let lastData = baseStr;
        // 处理data URL格式
        if (matches) {
            prefix = matches[1];
            lastData = matches[2];
        }
        for (let i = 0; i < lastData.length; i += base64Size) {
            let part = lastData.slice(i, i + base64Size);
            // 如果不是最后一块,确保长度是4的倍数
            if (i + base64Size < lastData.length) {
                while (part.length % 4 !== 0) {
                    part += '=';
                }
            }
            // 如果是data URL格式,添加前缀
            if (matches && i === 0) {
                part = `data:${prefix};base64,${part}`;
            }
            result.push(part);
        }
        return result;
    },
    /**
     * 按兆字节(MB)大小分割 base64 字符串
     * @param {string} baseStr - base64
     * @param {number} mbSize - 分片目标字节大小
     * @returns {string[]} 返回切割后 base64 字符串数组
     */
    cut(baseStr, mbSize) {
        if (!baseStr || mbSize <= 0) return [];
        // 计算目标字节大小
        const targetByte = mbSize * 1024 * 1024;
        // base64 编码会将 3 字节数据编码为 4 字节
        // 因此需要调整分片大小以适应 base64 编码
        const base64PartSize = Math.floor(targetByte * 3 / 4);
        return this.split(baseStr, base64PartSize);
    }
}调用
// 按 1 兆进行分片切割
cut('data:image/png;base64,/9j/4AAQSkZJRgABAQAAA...', 1) 
 