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;
}
}
}