项目上的业务《接收一个xml信息包进行解析,xml中包含base64解析为电子文件》
我就直接贴代码了,不太会说,附上注释。
ps:需要根据系统字段和xml里面的标签字段进行建表,之后把xml标签的值进行添加。创建表的方法就是拼的sql。
// 在线接收接口
@Transactional(rollbackFor = Exception.class)
@Override
public String online(ColDataRecord colDataRecord, MultipartFile file, HttpServletRequest request) {
//解析token
String token = request.getHeader("token");
//判空
if (token == null || token.isEmpty()) {
return "token不存在";
}
if (file.isEmpty()) {
return "数据包丢失";
}
String userCode = tokenService.getUserCode(token);
Long unitId = tokenService.getUnitId(token);
String userName = tokenService.getUserName(token);
String unitName = tokenService.getUnitName(token);
String fileSign = UUIDutil.getUUID();
//先根据传过来的数据创建file表和efile表
String eFileTableName = TableUtil.getColTableName(colDataRecord.getUnitId(), colDataRecord.getArcId(), "EFILE", 2);
String fileTableName = TableUtil.getColTableName(colDataRecord.getUnitId(), colDataRecord.getArcId(), "FILE", 2);
try {
createTableService.createOnlineTable(colDataRecord.getUnitId(), colDataRecord.getArcId());
} catch (Exception e) {
e.printStackTrace();
return "数据表创建失败";
}
//解析传过来的xml
// 创建SAXReader的对象reader
SAXReader reader = new SAXReader();
//file表数据map
Map<String, Object> field = new HashMap<>();
//efile表数据集合
List<Map<String, Object>> eFileList = new ArrayList<>();
String xmlName = null;
Res ress = null;
try {
//MultipartFile文件可以通过.getOriginalFilename()来获取到文件的原名
xmlName = file.getOriginalFilename();
MultipartFile[] s = {file};
//数据包上传到minio
ress = archivesManagementService.collectUpload(
new Input(userCode, userName, unitId.toString(), colDataRecord.getArcId().toString(), xmlName, 2, 1), s);
//临时存储到服务器本地,准备解析
String path = ContentsUtil.TEMP_ONLINE + xmlName;
BufferedOutputStream out1 = FileUtil.getOutputStream(path);//path
IoUtil.copy(file.getInputStream(), out1, IoUtil.DEFAULT_BUFFER_SIZE);
//开始解析
//读取xml为Document对象
Document document = reader.read(new File(path));//path
//bookStore 懒得改名 document.getRootElement()获取根元素
Element bookStore = document.getRootElement();
//获取一个迭代器,用于循环子节点
Iterator it = bookStore.elementIterator();
//循环子节点
while (it.hasNext()) {
Element book = (Element) it.next();
//获取标签名称
String labelName = book.getName();
//不是EFILE标签的添加到file
if (!labelName.equals("EFILE")) {
field.put(book.getName(), book.getText());
}
}
//系统参数
field.put("ID", null);
field.put("CREATETIME", DateUtils.getCurrentYMDHMSStr());
field.put("ATTRZB", 0);
field.put("ATTREX", 0);
field.put("STATUS", 0);
field.put("ATTRWEB", 0);
field.put("SIGN", fileSign);
//添加file表数据
onlinePackageMapper.addOnlineFile(fileTableName, field);
//这里重新获取一个迭代器是因为如果继续使用it,那这个it指向的地址也是上面那个it,就会导致运行到这it.hasNext()已经没有下一个标签了。
Iterator<Element> it2 = bookStore.elementIterator();
while (it2.hasNext()) {
//efile会存在多个
Map<String, Object> eFile = new HashMap<>();
Element book = (Element) it2.next();
String labelName = book.getName();
String fileName = null;
Res res = null;
if (labelName.equals("EFILE")) {
Iterator itt = book.elementIterator();
byte[] bytes = null;
//进入EFILE标签里面
while (itt.hasNext()) {
Element bookChild = (Element) itt.next();
String eFileName = bookChild.getName();
if (eFileName.equals("FILENAME")) {
fileName = bookChild.getText();
}
if (eFileName.equals("BASE64")) {
//解析base64
BASE64Decoder decoder = new BASE64Decoder();
bytes = decoder.decodeBuffer(bookChild.getText());
//不落地直接转MultipartFile,因为另一个服务接口参数不一样。
//base64转MultipartFile会出现转出来的文件没有文件信息,所以需要自己添加。当然如果base64带文件信息可能没问题,没试过
MultipartFile multipartFile = new MockMultipartFile("file", fileName, ContentType.MULTIPART.toString(), new ByteArrayInputStream(bytes));
MultipartFile[] files = {multipartFile};
//将解析出来的电子文件上传
res = archivesManagementService.collectUpload(
new Input(userCode, userName, unitId.toString(), colDataRecord.getArcId().toString(), fileName, 2, 2), files);
} else {
//添加其他字段属性
eFile.put(eFileName, bookChild.getText());
}
}
eFile.put("PID", field.get("ID"));
eFile.put("KEYWORD", "");
eFileList.add(eFile);
onlinePackageMapper.addOnlineEFile(eFileTableName, eFile);
}
}
} catch (DocumentException | IOException e) {
e.printStackTrace();
}
//添加数据接收记录信息表
......
return onlinePackageMapper.addDataRecord(colDataRecord) != -1 ? "success" : "接收失败";
}
项目上的业务《接收一个xml信息包进行解析,xml中包含base64解析为电子文件》的更多相关文章
- 项目上有红色感叹号, 一般就是依赖包有问题, remove依赖,重新加载,maven的也行可认删除,自己也会得新加载
项目上的红色叹号, 要下面提示: "Problems" 里的errors , 看是什么错误, 一般是由于网络等原因, 依赖没有下载完整, 只有文件名字对了, 内容不全, ...
- Android——PULL解析XML
简介 Android中常常使用XML文件保存用户的APP设置信息.因此需要对XML文件的相关操作进行了解.本文将以<学生信息管理系统>为案例背景进行介绍相关的XML解析的介绍,以及其他相关 ...
- dom4j解析xml文档全面介绍
一.dom4j介绍 dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点, ...
- 17.JAVA-Dom、Sax解析XML详解
在JAVA中,解析有三种方式: Dom解析(支持改删,耗内存). Sax解析(不支持改删,不耗内存). Pull解析(在Android中推荐使用的一种解析XML的方式,在下章学习). 1.支持Dom与 ...
- JAVA对XML文件的读写(有具体的代码和解析
XML 指可扩展标记语言(EXtensible Markup Language),是独立于软件和硬件的信息传输工具,应用于 web 开发的许多方面,常用于简化数据的存储和共享. xml指令 处理指令, ...
- JavaWeb学习日记----SAX解析XML
1.SAX解析XML文档的方式: 与DOM方式解析不同,DOM方式解析是根据XML的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象.优点是可以很方便实现增删改操作.缺点是,如 ...
- ZeroMQ接口函数之 :zmq_recv – 从一个socket上接收一个消息帧
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_recv zmq_recv(3) ØMQ Manual - ØMQ/4.1.0 Name zmq_r ...
- ZeroMQ接口函数之 :zmq_recvmsg – 从一个socket上接收一个消息帧
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-recvmsg zmq_recvmsg(3) ØMQ Manual - ØMQ/4.1.0 Nam ...
- 将本地已有的一个项目上传到新建的git仓库的方法
将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种. 一. 克隆+拷贝 第一种方法比较简单,直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去.然后push到远程仓库上去即 ...
- 怎么将本地已有的一个项目上传到新建的git仓库的方法
将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种. 一. 克隆+拷贝 第一种方法比较简单,直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去.然后push到远程仓库上去即 ...
随机推荐
- GIN and RUM 索引性能比较
gin索引字段entry构造的TREE,在末端posting tree|list 里面存储的是entry对应的行号. 别无其他信息.rum索引,与GIN类似,但是在posting list|tree的 ...
- Linux云主机安全入侵排查步骤
导语 经常有用户报障系统被植入恶意程序,如挖矿软件.ddos攻击病毒.syn映射攻击病毒等,可以按照以下流程为用户排查入侵病毒类型: 一.定位病毒进程 对于用户反馈云主机性能卡顿,CPU和内存占用较高 ...
- Windows优先使用IPv4
当前主流的Windows系统(从Windows 7之后)都会同时使用ipv6和ipv4,并且优先使用ipv6.当你ping另一个服务器的时候就能看到,优先使用的是ipv6进行通信.由于能够在DNS中解 ...
- 输入法词库解析(三)紫光拼音词库.uwl
详细代码:https://github.com/cxcn/dtool 前言 .uwl 是紫光拼音输入法(现在叫华宇拼音输入法)使用的词库. 解析 紫光的词库有点复杂,拼音用的索引,但是拼音表没有写在词 ...
- logstash安装插件修改使用的gem源
gem source -l # 查看当前使用的gem源 gem source --remove https://rubygems.org/ # 移除gem源 gem source -a https:/ ...
- SpringBoot课程学习(一)
@SpringBootTest指定测试的启动类 声明@SpringBootTest @Test注解 @Test 指定测试方法 @Order排序 一:先声明排序模式 @TestMethodOrder(M ...
- NOIP2011 提高组 聪明的质监员(二分+前缀和)
看到这道题,应该都能想到用二分,那问题是怎么去判定呢? 我们考虑用前缀和(a1统计w,a2统计v),枚举每个矿石,,当前判定的值是x,如果该矿石的w>=x,a1[i]=a1[i-1]+1,a2[ ...
- swoole学习笔记
一.服务端 0. swoole常用的配置项: daemonize = true 守护进程化 worker_num #swoole配置参数 设置启动的Worker进程数: 如 1 个请求耗时 100ms ...
- Spring的自动装配和注解
Bean的自动装配 自动装配说明 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean. Spring的自动装配需要从两个角度来实现,或 ...
- Docker | 自定义网络(网关、子网地址)
了解 docker network 通过下面的命令来获取帮助 docker network --help Commands: connect Connect a container to a netw ...