为方便演示, 所有处理逻辑全部放在Controller完成, 不再写Service等各层接口及实现. 如需在Service层处理, 思路及方法也是完全一样的.
先说前台. 运行以后就是这样子的. 一个非常简单的表单页面, 两个文件上传按钮, 一个提交
其中单个文件上传, 即只能选择一个文件, 无法同时选择多个
相对的, 多个文件就是可以同时选择多个文件了
文件选择以后就是这个样子
代码如下: 一个form, 文件上传就是一个<input>输入, 属性type="file". 此时只能选择单个文件. 而后面加一个multiple, 即可同时选择多个文件
action属性中的路径后缀为.htm, 是因为我的环境中配置了映射, 所以要在Controller中指定的路径后添加一个.htm后缀, 否则系统会报404. 如果没有配置该项则无需添加后缀
另一点需要注意的是, 要实现文件上传, form中必须指定属性enctype="multipart/form-data". method属性为"post"
前台就这些东西了, 没什么特殊的. 然后再看后台
首先Spring配置文件中加这么一个bean
也可以在代码中直接创建对象
但是个人认为配置以后使用比较方便, 各位根据实际需要来吧
其中maxUploadSize属性用来设计上传文件的最大值, 单位是字节. 注意这里是总的上传限制, 比如设置为10M, 上传了4个3M的文件. 虽然单个文件都在10M以内, 但是总大小已经超过10M限制, 会抛出MaxUploadSizeExceededException异常
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
<html>
<head>
<title>用户管理</title>
<meta name="decorator" content="default" />
<script type="text/javascript">
$(document).ready(function(){
$("#btnImport").click(function(){
$.jBox($("#importBox").html(),
{
title:"导入数据",
buttons:
{
"关闭":true
},
bottomText:"导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"
});
});
});
</script>
</head>
<body>
<div id="importBox">
<form id="importForm" action="${ctx}/sys/hrSendMail/import" method="post" enctype="multipart/form-data" class="form-search" style="padding-left: 20px; text-align: center;" onsubmit="loading('正在导入,请稍等...');">
<br />
<input id="uploadFile" name="files" type="file" style="width: 330px" multiple/>
<br /> <br />
<input id="btnImportSubmit" class="btn btn-primary" type="submit" value=" 发 送 " />
</form>
</div>
<sys:message content="${message}" />
</body>
</html>
/* 发送工资条数据
*
* @param file
* @param redirectAttributes
* @return
*/
@RequestMapping(value = "import", method = RequestMethod.POST)
public String importFile(@RequestParam("files") MultipartFile[] files,
RedirectAttributes redirectAttributes) {
if (files != null && files.length > 0) {
try {
int successNum = 0;
int failureNum = 0;
StringBuilder failureMsg = new StringBuilder();
ImportExcel ei = null;
List<Payroll> list = null;
List<String> messageList = null;
for (MultipartFile file : files) {
ei = new ImportExcel(file, 0, 0);
list = ei.getHrDataList(Payroll.class);
for (Payroll Payroll : list) {
try {
if (emailFormat(Payroll.getMail())) {
BeanValidators.validateWithException(validator,
Payroll);
SendMailUtil.sendInlineMail(Payroll);
successNum++;
} else {
failureMsg.append("<br/>邮箱 "
+ Payroll.getMail() + " 不符合邮箱规范 ");
failureNum++;
}
} catch (ConstraintViolationException ex) {
failureMsg.append("<br/>工资条" + Payroll.getMail()
+ " 发送失败:");
messageList = BeanValidators
.extractPropertyAndMessageAsList(ex, ": ");
for (String message : messageList) {
failureMsg.append(message + "; ");
failureNum++;
}
} catch (Exception ex) {
failureMsg.append("<br/>工资条 " + Payroll.getMail()
+ " 发送失败:" + ex.getMessage());
}
}
}
if (failureNum > 0) {
failureMsg.insert(0, ",失败 " + failureNum + " 条工资条,发送信息如下:");
}
addMessage(redirectAttributes, "已成功发送 " + successNum + " 条工资条"
+ failureMsg);
} catch (Exception e) {
addMessage(redirectAttributes, "发送工资条失败!失败信息:" + e.getMessage());
}
}
return "redirect:" + adminPath + "/sys/hrSendMail/index?repage";
}
/**
* 验证输入的邮箱格式是否符合
*
* @param email
* @return 是否合法
*/
public boolean emailFormat(String email) {
boolean tag = true;
if (!email.matches("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+")) {
tag = false;
}
return tag;
}