java处理金证中登查询图片二进制流问题
package com.szkingdom.kess.model; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Vector; import org.apache.axis.encoding.Base64;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element; import com.szkingdom.kess.service.ConfigService;
import com.szkingdom.kess.ui.ClientFrame; /**
* 处理接口的返回结果集
*/
public class ServiceResult { private String operation = null;
private String resultStr = null; private String recordType = null;
private String binaryOutput = null;
private String flag = null;
private String prompt = null; private String[] resultHeads = new String[];
private Vector<Vector<String>> allRecord = new Vector<Vector<String>>(); private byte[] imgBytes = null; private String recordXml = null; public ServiceResult(String operation, String resultStr) throws DocumentException, IOException {
this.operation = operation;
this.resultStr = resultStr;
Service service = ConfigService.getInstance().getServices().getService(operation);
this.recordType = service.getRecordType();
this.binaryOutput = service.getBinaryOutput();
if(null == this.binaryOutput || this.binaryOutput.equals("")) { //处理xml格式的数据
handleXmlResult(resultStr);
}
else { //处理二进制的数据,图片
byte[] resultStrBytes = Base64.decode(resultStr);
if( == resultStrBytes.length) {
handleXmlResult(ClientFrame.clientReqServices.parseXMLResultError("未能查询到对应的影像数据"));
}
else {
int xmlLen = ;
for (int i = ; i < ; i++) {
int shift = ( - - i) * ;
xmlLen += (resultStrBytes[i + ] & 0x000000FF) << shift;
}
this.resultStr = new String(resultStrBytes, , xmlLen);
handleXmlResult(this.resultStr); imgBytes = new byte[resultStrBytes.length - xmlLen - ];
System.arraycopy(resultStrBytes, xmlLen + , imgBytes, , imgBytes.length);
File file = new File("images");
if(!file.exists()) {
file.mkdir();
}
FileOutputStream fops = new FileOutputStream(new File("images/download" + getImgType(imgBytes)));
fops.write(imgBytes);
fops.close();
}
}
} private void handleXmlResult(String xmlStr) throws DocumentException {
Document doc = DocumentHelper.parseText(xmlStr);
Element rootEle = doc.getRootElement();
Element resultEle = rootEle.element("result");
this.flag = resultEle.element("flag").getText();
this.prompt = resultEle.element("prompt").getText();
List<Element> rowEleList = rootEle.element("record").elements("row");
if(this.recordType.equals("")) {
for(int i = , rowLen = rowEleList.size(); i < rowLen; i++) {
Element rowEle = rowEleList.get(i);
List<Element> resultEleList = rowEle.elements();
int resultLen = resultEleList.size();
if( == i) {
resultHeads = new String[resultLen];
}
Vector<String> tmpVec = new Vector<String>();
for(int j = ; j < resultLen; j++) {
Element rowResultEle = resultEleList.get(j);
if( == i) {
resultHeads[j] = rowResultEle.getName();
}
tmpVec.add(rowResultEle.getText()); }
allRecord.add(tmpVec);
}
}
else {
String recordNodeXml = rootEle.element("record").asXML();
recordXml = recordNodeXml.equals("<record/>") ? "" :
recordNodeXml.substring(recordNodeXml.indexOf("<record>") + , recordNodeXml.lastIndexOf("</record>"));
}
} private String getImgType(byte[] imgBytes) {
if(null == imgBytes) {
return null;
} StringBuilder stringBuilder = new StringBuilder();
for (int i = ; i < ; i++) {
String hexStr = Integer.toHexString(imgBytes[i] & 0xFF); //byte to int
stringBuilder.append(hexStr.length() < ? "" : hexStr);
}
String typeStr = stringBuilder.toString().toUpperCase(); if(typeStr.contains("424D")) {
return ".bmp";
}
if(typeStr.contains("FFD8FF")) {
return ".jpg";
}
if(typeStr.contains("")) {
return ".gif";
}
if(typeStr.contains("49492A0")) { //tif格式有两个版本的标准,"49492A00"
return ".tif";
}
if(typeStr.contains("89504E47")) {
return".png";
} return ".jpg";
} public String getResultStr() {
StringBuilder strBuilder = new StringBuilder();
strBuilder.append("接口名称:" + this.operation + "\n");
strBuilder.append("执行结果:" + ("".equals(this.flag) ? "执行成功" : "执行失败") + "\n");
strBuilder.append("提示信息:" + this.prompt + "\n"); StringBuilder strBuilderRec = new StringBuilder();
if(this.recordType.equals("")) {
for(int i = ; i < this.resultHeads.length; i++) {
strBuilderRec.append(this.resultHeads[i].trim() + "\t");
}
strBuilderRec.append("\n");
for(int i = , rowLen = this.allRecord.size(); i < rowLen; i++) {
Vector<String> rowVec = this.allRecord.get(i);
for(int j = , colLen = rowVec.size(); j < colLen; j++) {
strBuilderRec.append(rowVec.get(j).trim() + "\t");
}
strBuilderRec.append("\n");
}
}
else {
strBuilderRec.append(this.recordXml);
}
String recStr = strBuilderRec.toString().trim();
strBuilder.append(recStr.equals("") ? "" : "返回结果:\n" + recStr);
return strBuilder.toString();
}
public byte[] getImgBytes() {
return imgBytes;
} public String getOperation() {
return operation;
} public String getRecordType() {
return recordType;
} public String getFlag() {
return flag;
} public String getPrompt() {
return prompt;
} public String[] getResultHeads() {
return resultHeads;
} public String getRecordXml() {
return recordXml;
}
}
java处理金证中登查询图片二进制流问题的更多相关文章
- 用NOPI将图片二进制流导出到Excel
这儿采取的是将图片的二进制流导出到Excel,直接上代码: /// <summary> /// DataTable导出到Excel的MemoryStream /// </summar ...
- php canvas 前端JS压缩,获取图片二进制流数据并上传
<?php if(isset($_GET['upload']) && $_GET['upload'] == 'img'){ //二进制数据流 $data = file_get_c ...
- 前端将图片二进制流显示在html端
工作中碰到的问题,在处理接口返回的验证码图片时,由于返回的是encode编码代码,在js端获取到数据之后,通过函数encodeURI()来进行解码,之后可以通过在src中设置来实现图片显示:
- php中使用head进行二进制流输出,让用户下载PDF等附件的方法
http://blog.csdn.net/jallin2001/article/details/6872951 在PHP的手册中,有如下的方法,可以让用户方便的下载pdf或者其他类似的附件形式,不过这 ...
- Java生成二进制文件与Postman以二进制流的形式发送请求
业务描述: 模拟终端(智能家居)发送HTTP POST请求,请求参数为二进制流:而且,二进制流是加密后的数据,因此调试分两步: 1.Java代码生成加密后数据,并保存为二进制流文件 (电脑上的图片就是 ...
- java中如何把图片转换成二进制流的代码
在学习期间,把开发过程经常用到的一些代码段做个备份,下边代码内容是关于java中如何把图片转换成二进制流的代码,应该能对各朋友也有用处. public byte[] SetImageToByteArr ...
- Java多态与C++中多态的实现
大牛的文章,值得拜读http://www.ibm.com/developerworks/cn/java/j-lo-polymorph/ 粘贴过来好多图片丢失了 /(ㄒoㄒ)/~~ 众所周知,多态是面向 ...
- [转帖]在RDLC中使用外部图片
原文链接:http://blog.csdn.net/rock870210/article/details/4559962 在RDLC中使用外部图片 2009-09-16 19:08 3416人阅读 评 ...
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. 不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...
随机推荐
- EM算法[转]
最大期望算法:EM算法. 在统计计算中,最大期望算法(EM)是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐藏变量. 最大期望算法经过两个步骤交替进行计算: 第 ...
- POJ 3276 Face The Right Way(前缀和优化)
题意:有长度为N的01串,有一个操作可以选择连续K个数字取反,求最小的操作数和最小的K使得最后变成全1串.(N<=5000) 由于K是不定的,无法高斯消元. 考虑枚举K,求出最小的操作数. 显然 ...
- 口胡:[HNOI2011]数学作业
题面 一开始看这题看了好久--觉得这题不可做. 结果是看错题了,我居然看着一段长长的C开头的单词,然后就觉得这是卡特兰数--不知道我在想些什么-- 观察到对于 i = 1~9 : f[i] = f[i ...
- 【BZOJ1565】【NOI2009】植物大战僵尸(网络流)
[BZOJ1565][NOI2009]植物大战僵尸(网络流) 题面 BZOJ 洛谷 题解 做了这么多神仙题,终于有一道能够凭借自己智商能够想出来的题目了.... 好感动. 这就是一个比较裸的最小割模型 ...
- 洛谷 P1325 雷达安装 解题报告
P1325 雷达安装 题目描述 描述: 假设海岸线是一条无限延伸的直线.它的一侧是陆地,另一侧是海洋.每一座小岛是在海面上的一个点.雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d ...
- 【Python3的进制扫盲】
一.进制 1.进制简介 进制就是进位制,是人们规定的一种进位方法.计算机底层的数据运算和存储都是二进制数据.计算机语言就是二进制,计算机能直接识别二进制数据,其它数据都不能直接识别. 2.常用进制 对 ...
- joomla! 3.X 开发系列教程
http://www.mengyunzhi.com/members-resource/joomla/87-joomla-menu-study.html 学习地址 http://blog.csdn.ne ...
- 【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数
蒟蒻__stdcall终于更新博客辣~ 一下午+一晚上=一道计数题QAQ 为什么计数题都这么玄学啊QAQ Prelude 题目链接:这里是传送门= ̄ω ̄= 下面我将分几个步骤讲一下这个题的做法,大家不 ...
- SpringBoot (六) :如何优雅的使用 mybatis
原文出处: 纯洁的微笑 这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关 ...
- 前端PHP入门-016-静态变量
如果我想知道函数被调用了多少次怎么办?在没有学习静态变量的时候,我们没有好的办法来解决. 静态变量的特点是:声明一个静态变量,第二次调用函数的时候,静态变量不会再初始化变量,会在原值的基础上读取执行. ...