摘要:页面上传txt文档,读取文档中的内容,查数据库中现有的信息(次新),更新到最新的数据中。
1 页面按钮
<button type="button" class="btn btn-xs btn-danger" onclick="clickFiles()"
id="uploadFiles" style="width:100px;height:30px;font-size:15px">上传文件</button>
<div class="form-group" style="display: none;">
<input type="file" name="file" id="file" class="form-control" multiple="multiple" accept=".txt" onchange="uploadSpecFiles()">
</div>
按钮button需要绑定一个点击事件----οnclick= “clickFiles()” ,同时还需要一个input绑定一个改变事件----οnchange=“uploadSpecFiles()”
function clickFiles() {
$("#file").click();
}
function uploadSpecFiles() {
var formData = new FormData();
for (var i = 0; i < $("#file")[0].files.length; i++) { /*循环获取上传的文件*/
formData.append("file", $("#file")[0].files[i]);
}
var le = $("#file")[0].files.length;
if (le == 0) {
layer.alert("请选择文件!");
return;
} else if (le > 1) {
layer.alert("只能选择一个文件上传!");
$("#file").val("");
return;
} else {
//获取文件名最后一个.的位置
var index= $("#file")[0].files[0].name.lastIndexOf(".");
//获取文件名后缀
var ext = $("#file")[0].files[0].name.substr(index+1);
if(!isAssetType(ext)){
layer.alert("请上传正确的格式!");
$("#file").val("");
return;
}
//上传方法
$.ajax({
cache: true,
url: getUrlCutJsessionId(ctx, "XXX/XXX"), //所需要的列表接口地址
data: formData,
dataType: "json",
type: "post",
contentType: false,
processData: false,
error: function (request) {
layer.msg("Connection error");
formData = new FormData();
$("#file").val("");
},
success: function (r) {
if (r.success) {
if(r.data == '0'){
layer.open($.extend({
content: '<div><div class="layui-layer-content">上传失败</div></div>',
yes: undefined
}, false ? {} : undefined));
}else {
console.log(r.data);//返回的是一个map集合
layer.alert("上传成功,共上传"+r.data['XXX']+"条记录,继承信息成功"+r.data['XXX']+"条记录!");
}
$("#file").val("");
formData = new FormData();
} else {
$("#file").val("");
layer.alert(r.msg);
formData = new FormData();
}
}
});
}
}
//判断后缀是否合规
function isAssetType(suffix) {
return ['txt'].
indexOf(suffix.toLowerCase()) !== -1;
}
2 读取文件
1>在读取文件时,用到了MultipartFile工具类。
用工具类中的file.getOriginalFilename()得到文件名称,判断文件名称中是否包含特殊字符
String filename = file.getOriginalFilename();
if(!CheckUtil.checkUploadFileName(filename)){
rr.setSuccess(false);
rr.setMsg("文件名中不能包含特殊字符。");
return rr;
}
//判断文件后缀是否符合要求
String suffix = filename.substring(filename.lastIndexOf(".") + 1);
if(!"txt".equals(suffix)){
rr.setMsg("导入文件必须为txt文件");
rr.setSuccess(false);
return rr;
}
2>
Map<String, Object> params = new HashMap<>();
List<SeriousIllnessPolicy> hrList = new ArrayList<>();
try {
//创建转换流对象 参数是字节输入流对象
InputStreamReader reader=new InputStreamReader(file.getInputStream());
//转换输入流
BufferedReader br = new BufferedReader(reader);
String line="";//定义字符串 保存行数据
while (line !=null) {
SeriousIllnessPolicy serious = new SeriousIllnessPolicy();
//读取行数据
line = br.readLine();
if(line !=null && !"".equals(line)){//如果行为空,则跳过
serious.setEccPersonNo(line);
hrList.add(serious);//添加到集合中
}
}
/*判断导入模板有无数据*/
if (hrList.size() < 1) {
result.setMsg("导入数据为空");
result.setSuccess(false);
return result;
}
params.put("hrList",hrList);
} catch (IOException e) {
e.printStackTrace();
}
3 更新信息
List<SeriousIllnessPolicy> hrList = (List<SeriousIllnessPolicy>) params.get("hrList");
ObjectMapper mapper = new ObjectMapper();
List<SeriousIllnessPolicy> list = mapper.convertValue(hrList, new TypeReference<List<SeriousIllnessPolicy>>() {});
……
//根据得到的list,遍历,查数据库,然后更新信息
获取参数时,可能出现的错误类型转换异常:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX
更新数据量大时,建议用jdbc的写法进行批量更新。