项目上的业务《接收一个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到远程仓库上去即 ...
随机推荐
- git 密码修改
当由于修改了Git 的密码导致 pull 等操作报错时,比如报以下错误: fatal: Authentication failed for 'http://xxxxxxxxxxxxxxxxxx.git ...
- 【Android 逆向】动态调试AliCrackme_1
1 试玩 apk # 安装APK到真机 adb install AliCrackme_1.apk 打开apk,投石问路,输入123试一下 2 将apk 拖入androidKiller,得到反编译的sm ...
- 华南理工大学 Python第1章课后小测
1.(单选)计算机有两个基本特性:功能性和()性.(本题分数:5)A) 可存储B) 可计算C) 可通信D) 可编程您的答案:D 正确率:100%2.(单选)计算机硬件可以直接识别和执行的程序设计语言 ...
- MyBatis标签之Select resultType和resultMap
摘要:介绍MyBatis 中Select标签的两个属性resultType和resultMap及其区别. 1 MyBatis动态SQL之if 语句 2 MyBatis动态sql之where标签|转 3 ...
- shell下cat EOF中变量$处理
在使用cat EOF中出现$变量通常会直接被执行,显示执行的结果.若想保持$变量不变需要使用 \ 符进行注释 [root@localhost ~]# cat >> aa.txt <& ...
- MHA架构的实现方式
转载自:https://www.linuxprobe.com/centos7-mha-mysql5.html 安装mysql5.7,并配置好主从复制 第一:安装mysql57,并关闭防火墙 yum i ...
- rpm,docker,k8s三种方式安装部署GitLab服务
rpm方式 源地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ wget https://mirrors.tuna.tsinghua ...
- Node.js(四)json
npm init -y(初始化项目) npm install express(引入express) npx express-generator -e(自动生成模板.添加对 ejs 模板引擎的支持) n ...
- LeetCode------合并两个有序数组(4)【数组】
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-sorted-array 1.题目 给你两个按 非递减顺序 排列的整数数组 nums ...
- F118校准(一)-- 安装CA310驱动程序及SDK
1. 准备工作 下载Ca310_drv.zip文件并解压,备用. http://www.xk-image.com/download/blog/0001_F118校准/Ca310_drv.zip 准备好 ...