项目上的业务《接收一个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到远程仓库上去即 ...
随机推荐
- 日志:Redo Log 和 Undo Log
本篇文章主要介绍 Redo Log 和 Undo Log: 利用 Redo Log 和 Undo Log 实现本地事务的原子性.持久性 Redo Log 的写回策略 Redo Log Buffer 的 ...
- Python数据科学手册-机器学习: 流形学习
PCA对非线性的数据集处理效果不太好. 另一种方法 流形学习 manifold learning 是一种无监督评估器,试图将一个低维度流形嵌入到一个高纬度 空间来描述数据集 . 类似 一张纸 (二维) ...
- 永恒之蓝(MS17-010)漏洞复现
1. 漏洞介绍 永恒之蓝: 恒之蓝是指2017年4月14日晚,黑客团体Shadow Brokers(影子经纪人)公布一大批网络攻击工具,其中包含"永恒之蓝"工具,"永恒之 ...
- Java根据Freemarker模板生成Word文件
1. 准备模板 模板 + 数据 = 模型 1.将准备好的Word模板文件另存为.xml文件(PS:建议使用WPS来创建Word文件,不建议用Office) 2.将.xml文件重命名为.ftl文件 3 ...
- ProxySQL 审计
1.审计日志 ProxySQL 2.0.5 引入了审计日志.此功能允许跟踪某些连接活动.要启用此功能,需要配置变量 mysql-auditlog_filename,也就是审计日志的文件名.此变量的默认 ...
- 使用 Elastic 技术栈构建 K8S 全栈监控 -3: 使用 Filebeat 采集 Kubernetes 集群日志
文章转载自:https://www.qikqiak.com/post/k8s-monitor-use-elastic-stack-3/ 操作步骤 filebeat连接es使用上一步创建的secret: ...
- 6.Ceph 基础篇 - CephFS 文件系统
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247485294&idx=1&sn=e9039504 ...
- ceph安装Dashboard并开启Object Gateway管理功能
安装配置dashboard Ceph-Dashboard 是用 Python 开发的一个 Ceph 的监控面板,用来监控 Ceph 的运行状态.同时 提供 REST API 来访问状态数据. 低版本的 ...
- 第二章:视图层 - 10:动态生成PDF文件
可以通过开源的Python PDF库ReportLab来实现PDF文件的动态生成. 一.安装ReportLab ReportLab库在PyPI上提供,可以使用pip来安装: $ pip install ...
- 使用Logstash把MySQL数据导入到Elasticsearch中
总结:这种适合把已有的MySQL数据导入到Elasticsearch中 有一个csv文件,把里面的数据通过Navicat Premium 软件导入到数据表中,共有998条数据 文件下载地址:https ...