图片文件与字节数组字符串互转(Base64编解码)
1.图片文件转化为字节数组字符串,并对其进行Base64编码解决
参数imgFile:图片文件
// 将图片文件转化为字节数组字符串,并对其进行Base64编码解决 public static String imageToBase64ByLocal(String imgFile) { try { InputStream in = null; byte[] data = null; // 读取图片字节数组 in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); // 对字节数组Base64编码 BASE64Encoder encoder = new BASE64Encoder(); // 返回Base64编码过的字节数组字符串 return encoder.encode(data); } catch (IOException e) { System.out.println(e); } return null; }
运行后果:
2.字节数组字符串转换为图片文件,并进行Base64解码
参数imgStr:待转换的字节数组字符串
参数imgFilePath:转换后的图片寄存地址
public static boolean base64ToImage(String imgStr, String imgFilePath) { // 对字节数组字符串进行Base64解码并生成图片 // 图像数据为空 if (isEmpty(imgStr)) { return false; } try { BASE64Decoder decoder = new BASE64Decoder(); // Base64解码 byte[] b = decoder.decodeBuffer(imgStr); for (int i = 0; i < b.length; ++i) { if (b[i] < 0) { // 调整异样数据 b[i] += 256; } } OutputStream out = new FileOutputStream(imgFilePath); out.write(b); out.flush(); out.close(); return true; } catch (Exception e) { System.out.println(e); } return false; } private static boolean isEmpty(String input) { return input == null || "".equals(input); }
运行后果:
图片上传云存储,返回url
将图片上传至云存储,返回图片的url
/** * 上传图片到云存储,返回url和图片名称 * @param multipartFile * @return */ @Override public BaseResponse<Map<String, String>> upload(MultipartFile multipartFile) { BaseResponse baseResponse = new BaseResponse(); try { byte[] picBbytes= multipartFile.getBytes(); String base64Str=new String(org.apache.commons.codec.binary.Base64.encodeBase64(picBbytes),"utf-8"); String picUrl=getUploadPicUrl(base64Str); Map<String, String> map = new HashMap<>(); if (picUrl != null){ map.put("picUrl", picUrl); map.put("picName", multipartFile.getOriginalFilename()); baseResponse.setData(map); baseResponse.setMsg("图片上传胜利"); baseResponse.setCode("0"); return baseResponse; } }catch (IOException e) { logger.error("错误码:{},错误信息:{},record:{}", DefaultErrorCode.PIC_UPLOAD_ERROR.getCode(), DefaultErrorCode.PIC_UPLOAD_ERROR.getMessage(), e); } baseResponse.setMsg(DefaultErrorCode.PIC_UPLOAD_ERROR.getMessage()); baseResponse.setCode("-1"); return baseResponse; } /** * 图片存储到云存储 * @param picBase64 * @return */ public String getUploadPicUrl(String picBase64) { try{ picBase64 = picBase64.replaceFirst("data:image/jpg;base64,", ""); byte[] picBuff = Base64.decode(picBase64); HikCStorConstant cStorConstant = getStorageDeviceList(); //logger.debug("获取存储设备信息列表: " + cStorConstant.getDeviceIP()); if(cStorConstant != null){ if (poolInfo == null){ poolInfo = getPoolInfoList(cStorConstant.getDeviceID()); } //logger.debug("获取资源池: " + poolInfo); if(poolInfo != null){ //logger.debug("图片筹备上传云存储"); cStorConstant.setPoolId(poolInfo.getPoolId()); cStorConstant.setSerialID(cStorConstant.getDeviceID()); String secretKey = new String( AESSO.decrypt(java.util.Base64.getDecoder().decode(cStorConstant.getSecretKey()), Authentication.exportSK(),false),"UTF-8"); //logger.debug("图片上传云存储secretKey: " + secretKey); cStorConstant.setSecretKey(secretKey.trim()); String picUrl = hikCStorUtil.writePic(cStorConstant,picBuff); logger.debug("图片上传云存储URL: "+picUrl); return "http://" + cStorConstant.getDeviceIP() + ":" + String.valueOf(cStorConstant.getPicDownloadPort()) + picUrl; } } }catch (Exception e){ logger.error("getUploadPicUrl error: ",e); } return null; } /** 获取服务信息*/ public ServiceAddressInfoDto findServiceInfo() { ServiceAddressInfoDto serviceAddressInfoDto = null; try { ApiResponse<ServiceInfoDto> serviceInfo = serviceDirectoryClient.getServiceInfo("sac","sac"); if (serviceInfo.getCode().equals("0")){ if (!org.apache.commons.lang3.ObjectUtils.isEmpty(serviceInfo.getData()) && serviceInfo.getData().getAddress().size() > 0){ for (ServiceAddressInfoDto dto:serviceInfo.getData().getAddress()) { if (dto.getNetprotocol().toLowerCase().equals("http")){ serviceAddressInfoDto = dto; break; } } serviceAddressInfoDto=serviceInfo.getData().getAddress().get(0); if (serviceAddressInfoDto == null){ serviceAddressInfoDto = serviceInfo.getData().getAddress().get(0); } } } } catch (Exception e) { logger.error("findServiceInfo error: ",e); } return serviceAddressInfoDto; } /** * 获取存储设备信息列表 * @return * @throws Exception */ public HikCStorConstant getStorageDeviceList() throws Exception { String uri = "/ISAPI/Storage/storageDeviceList?marker=&maxKeys=3000"; ServiceAddressInfoDto dto=findServiceInfo(); String url = null; if (dto!=null) { String sacUrl = "http://" + dto.getIp() + ":" + dto.getPort(); url = sacUrl + uri; } String secretKey = new String(Authentication.exportSK(),"UTF-8"); String accessKey = new String(Authentication.exportAK(),"UTF-8"); String date = DateGMCUtil.getGmtTime(); String auth = AuthProcess.getAuthorization(accessKey, secretKey, "GET", "","", date, uri, 1,"storage"); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set("Date", date); httpHeaders.set("Authorization", auth); httpHeaders.set("Connection", "close"); httpHeaders.setAccept(Lists.newArrayList(MediaType.APPLICATION_JSON)); HttpEntity<String> httpEntity = new HttpEntity(httpHeaders); ResponseEntity<String> entity = myRestTemplates.exchange(URI.create(url), HttpMethod.GET, httpEntity, String.class); if(entity != null && entity.getStatusCode() == HttpStatus.OK){ ResourceDeviceInfo deviceInfo = JSONObject.parseObject(entity.getBody(),ResourceDeviceInfo.class); for(HikCStorConstant cStorConstant : deviceInfo.getList()){ /**deviceType:1-云存储,2-CVR,3-PCNVR2.0,4-NVR*/ if(cStorConstant.getPicDownloadPort()!= 0 && cStorConstant.getPicUploadPort() != 0 /*&& cStorConstant.getDeviceType() == 1 */){ return cStorConstant; } } } return null; } /** * 获取资源池 * @return * @throws Exception */ public PoolInfo getPoolInfoList(String deviceId) throws Exception { String uri = "/ISAPI/Storage/poolInfoList?marker=&maxKeys=3000"; ServiceAddressInfoDto dto=findServiceInfo(); String url = null; if (dto!=null) { String sacUrl = "http://" + dto.getIp() + ":" + dto.getPort(); url = sacUrl + uri; } String secretKey = new String(Authentication.exportSK(),"UTF-8"); String accessKey = new String(Authentication.exportAK(),"UTF-8"); String date = DateGMCUtil.getGmtTime(); String auth = AuthProcess.getAuthorization(accessKey, secretKey, "GET", "", "", date, uri, 1,"storage"); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set("Date", date); httpHeaders.set("Authorization", auth); httpHeaders.set("X-Stor-DeviceID", deviceId); httpHeaders.set("Connection", "close"); httpHeaders.setAccept(Lists.newArrayList(MediaType.APPLICATION_JSON)); HttpEntity<String> httpEntity = new HttpEntity(httpHeaders); RestTemplate myRestTemplate=new RestTemplate(); ResponseEntity<String> entity = myRestTemplate.exchange(URI.create(url), HttpMethod.GET, httpEntity, String.class); if(entity.getStatusCode() == HttpStatus.OK){ ResourcePoolInfo poolInfo = JSONObject.parseObject(entity.getBody(),ResourcePoolInfo.class); Boolean isExist = false; for(PoolInfo pool : poolInfo.getList()){ //0-通用池 1-视频池 3-图片池 if(pool.getPoolType() == 0 && pool.getPoolStatus() == 1){ //是否存在图片资源池 isExist = true; return pool; } } if (!isExist){ for(PoolInfo pool : poolInfo.getList()){ //0-通用池 1-视频池 3-图片池 if(pool.getCoverType()==0 && pool.getPoolType() == 0 && "1".equals(pool.getDeviceType()) && pool.getPoolStatus() == 1){ //不可笼罩通用资源池 return pool; } } } } return null; }
测试: