Spring Java 把前端发过来的 base64 字符串上传到 oss

核心代码

MockMultipartFile imgFile = new MockMultipartFile("Signature.png", "Signature.png", "image/png", StringDisposeUtil.decode(base64));
byte[] imageFileBytes = imgFile.getBytes();

base64

data:image/png;base64,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

StringDisposeUtil.class(其实就是Hutool的Base64Decoder.decode(),因为Jenkins版本冲突所以抽出来了)

public class StringDisposeUtil {

    private static final byte PADDING = -2;

    private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;

    /**
     * Base64解码表,共128位,-1表示非base64字符,-2表示padding
     */
    private static final byte[] DECODE_TABLE = {
            // 0 1 2 3 4 5 6 7 8 9 A B C D E F
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 00-0f
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 10-1f
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63, // 20-2f + - /
            52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, // 30-3f 0-9,-2的位置是'='
            -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 40-4f A-O
            15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, // 50-5f P-Z _
            -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 60-6f a-o
            41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 // 70-7a p-z
    };


    /**
     * base64解码
     *
     * @param source 被解码的base64字符串
     * @return 被加密后的字符串
     */
    public static byte[] decode(CharSequence source) {
        return decode(bytes(source, DEFAULT_CHARSET));
    }

    /**
     * 解码Base64
     *
     * @param in 输入
     * @return 解码后的bytes
     */
    public static byte[] decode(byte[] in) {
        if (isEmpty(in)) {
            return in;
        }
        return decode(in, 0, in.length);
    }

    /**
     * 解码Base64
     * Params:
     * in – 输入 pos – 开始位置 length – 长度
     * Returns:
     * 解码后的bytes
     */
    public static byte[] decode(byte[] in, int pos, int length) {
        if (isEmpty(in)) {
            return in;
        }

        final MutableInt offset = new MutableInt(pos);

        byte sestet0;
        byte sestet1;
        byte sestet2;
        byte sestet3;
        int maxPos = pos + length - 1;
        int octetId = 0;
        byte[] octet = new byte[length * 3 / 4];// over-estimated if non-base64 characters present
        while (offset.intValue() <= maxPos) {
            sestet0 = getNextValidDecodeByte(in, offset, maxPos);
            sestet1 = getNextValidDecodeByte(in, offset, maxPos);
            sestet2 = getNextValidDecodeByte(in, offset, maxPos);
            sestet3 = getNextValidDecodeByte(in, offset, maxPos);

            if (PADDING != sestet1) {
                octet[octetId++] = (byte) ((sestet0 << 2) | (sestet1 >>> 4));
            }
            if (PADDING != sestet2) {
                octet[octetId++] = (byte) (((sestet1 & 0xf) << 4) | (sestet2 >>> 2));
            }
            if (PADDING != sestet3) {
                octet[octetId++] = (byte) (((sestet2 & 3) << 6) | sestet3);
            }
        }

        if (octetId == octet.length) {
            return octet;
        } else {
            // 如果有非Base64字符混入,则实际结果比解析的要短,截取之
            return (byte[]) copy(octet, new byte[octetId], octetId);
        }
    }

    /**
     * 包装 {@link System#arraycopy(Object, int, Object, int, int)}<br>
     * 数组复制,缘数组和目标数组都是从位置0开始复制
     *
     * @param src    源数组
     * @param dest   目标数组
     * @param length 拷贝数组长度
     * @return 目标数组
     * @since 3.0.6
     */
    public static Object copy(Object src, Object dest, int length) {
        //noinspection SuspiciousSystemArraycopy
        System.arraycopy(src, 0, dest, 0, length);
        return dest;
    }

    /**
     * 编码字符串
     *
     * @param str     字符串
     * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
     * @return 编码后的字节码
     */
    public static byte[] bytes(CharSequence str, Charset charset) {
        if (str == null) {
            return null;
        }

        if (null == charset) {
            return str.toString().getBytes();
        }
        return str.toString().getBytes(charset);
    }

    public static boolean isEmpty(byte[] array) {
        return array == null || array.length == 0;
    }

    // ----------------------------------------------------------------------------------------------- Private start

    /**
     * 获取下一个有效的byte字符
     *
     * @param in     输入
     * @param pos    当前位置,调用此方法后此位置保持在有效字符的下一个位置
     * @param maxPos 最大位置
     * @return 有效字符,如果达到末尾返回
     */
    private static byte getNextValidDecodeByte(byte[] in, MutableInt pos, int maxPos) {
        byte base64Byte;
        byte decodeByte;
        while (pos.intValue() <= maxPos) {
            base64Byte = in[pos.intValue()];
            pos.increment();
            if (base64Byte > -1) {
                decodeByte = DECODE_TABLE[base64Byte];
                if (decodeByte > -1) {
                    return decodeByte;
                }
            }
        }
        // padding if reached max position
        return PADDING;
    }

    static class MutableInt {

        private int value;

        public MutableInt(final int value) {
            this.value = value;
        }

        public MutableInt increment() {
            value++;
            return this;
        }

        public int intValue() {
            return value;
        }
    }

}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值