kingbase读取blob,下载文件注意事项

1,问题定位
 

 由于人大金仓存储的blob是16进制,且前后前后还包含了0字节。导致我们原先下载文件的方法有异常。


2,解决方案

在业务输出的时候,判断是否是人大金仓数据库,如果是人大金仓数据库,就进行转换,如果不是人大金仓就走原先的流程。


DbUtils.java 转换方法提取到公共包 

@Component
public class DbUtils {

    private static final Logger LOGGER = LoggerFactory.getLogger(DbUtils.class);

    @Value("${spring.datasource.driver-class-name:}")
    private String driverClassName;

    /**
     * 转换blob
     * 将十六进制字符串转byte
     * @param data
     * @return
     */
    public  byte[] converBlob(byte[] data) {

        //如果是kingBase这边获取blob的时候,需要进行转换下,把头尾都截取了,再把16进制转2进制
        if(StringUtils.isNotEmpty(driverClassName) && Constant.KING_BASE_DRIVER_NAME.equals(driverClassName)) {
            String s = new String(data);
            byte[] baKeyword = new byte[s.length() / 2];
            for (int i = 1; i < baKeyword.length; i++) {
                try {
                    baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(
                            i * 2, i * 2 + 2), 16));
                } catch (Exception e) {
                    LOGGER.error("转换blob异常",e);
                }
            }

            if (baKeyword.length > 1) {
                byte[] newByte = new byte[baKeyword.length-1];
                System.arraycopy(baKeyword, 1, newByte, 0, newByte.length);
                return newByte;
            }

            return baKeyword;
        }else{
            return data;
        }


    }

}

你可能感兴趣的:(大数据,kingbase,blob)