傳統的上傳文件方式是首先將文件上傳到指定路徑,然後再從該路徑下解析文件內容;這種方式實現比較繁瑣,並且暴漏了文件上傳的路徑,造成了安全隱患。現在我們介紹的是另一種方式,直接讀取文件流的方式,這種方式更加簡單安全,而且不佔用服務器內存。
一. jsp頁面
1. list.jsp
<ul>
<li><a class="icon" title="導入文件" rel="dlg_import_comment" target="dialog"
width="600" height="300" href="${ctx}/admin/comment/import.jsp"><span>導入文件</span></a></li>
<li><a class="icon" title="下載文件模版" href="${ctx}/admin/comment/comment_template.xls"><span>下載文件Excel模版</span></a></li>
<li>line</li>
</ul>
2. import.jsp
<%@ page contentType="text/html; charset=UTF-8" session="false" %>
<%@ include file="/WEB-INF/jspf/import.jspf" %>
<div class="pageContent">
<form method="post" action="${ctx}/admin/comment/import.do" enctype="multipart/form-data"
class="pageForm" οnsubmit="return iframeCallback(this, dialogAjaxDone);">
<div class="pageFormContent" layoutH="56">
<fieldset>
<legend>請選擇Excel文件,請務必按照規定的模版錄入數據</legend>
<dl class="nowrap">
<dd><input class="required" type="file" name="file"/></dd>
</dl>
</fieldset>
</div>
<div class="formBar">
<ul>
<li><div class="buttonActive"><div class="buttonContent"><button type="submit">導入</button></div></div></li>
<li><div class="button"><div class="buttonContent"><button class="close" type="button">關閉</button></div></div></li>
</ul>
</div>
</form>
</div>
二. controller控制層
commentController.java
@RequestMapping(value = "/comment/import.do", method = RequestMethod.POST)
public String doImport(HttpServletRequest req, HttpServletResponse resp) throws Exception {
// 權限驗證
if (!AuthFacade.hasRight(AUTHFUNCTIONID_ALL, true, resp)) {
return null;
}
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
if (!isMultipart) {
showMessage(req, resp, 300, "沒有選擇文件,請重新上傳", null, null);
}
// 計數器
int count = 0;
int fail = 0;
StringBuffer failBuf = new StringBuffer();// 記錄必填項爲空的
StringBuffer notExistsBuf = new StringBuffer(); // 記錄不存在的
StringBuffer lengthBuf = new StringBuffer(); // 記錄超出長度的
StringBuffer ruleBuf = new StringBuffer(); // 記錄格式不正確的
Integer statusCode = 200;
String msg = "";
Cell cell = null;
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 設置上傳文件大小的上限10m,-1表示無上限
upload.setFileSizeMax(1024 * 1024 * 10);
upload.setHeaderEncoding("gbk");
// 得到所有表單字段對象的集合
List<FileItem> fileItems = null;
try {
fileItems = upload.parseRequest(req);
} catch (FileUploadException e) {
e.printStackTrace();
showMessage(req, resp, 300, "解析上傳的文件出錯,請稍後重試", false, false);
}
if (fileItems == null || fileItems.isEmpty()) {
showMessage(req, resp, 300, "文件爲空,請重新上傳", false, false);
}
// 迭代導入到表內數據
Iterator it = fileItems.iterator();
while (it.hasNext()) {
FileItem fi = (FileItem) it.next();
if (!fi.isFormField()) {
InputStream is = fi.getInputStream();
Workbook wb = null;
try {
wb = Workbook.getWorkbook(is);
} catch (Exception e) {
e.printStackTrace();
resp.setCharacterEncoding("UTF-8");
resp.getWriter().println(new JSONBuilder().put("statusCode", 300).put("message", "讀取Excel表格出錯,請檢查Excel表格, 或者稍後重試").toString());
return null;
}
// 讀取第一個工作本
Sheet sheet = wb.getSheet(0);
if (sheet != null) {
int rowNum = sheet.getRows();
// 聚合詞
Comment comment = null;
CommentImg commentImg = null;
int groupId = 0; // 團購ID
int goodsId = 0; // 商品ID
int userId = 0; // 馬甲ID
Date createAt = null; // 評論時間
String content = ""; // 評論
String url1 = ""; // 圖片URL1
String url2 = ""; // 圖片URL2
String url3 = ""; // 圖片URL3
String url4 = ""; // 圖片URL4
String url5 = ""; // 圖片URL5
String uId = "";
String goId = "";
String grId = "";
String date = "";
long commentId = 0;
// 從第二行開始拿數據
for (int i = 1; i < rowNum; i++) {
List<String> str = new ArrayList<String>();
Cell[] cells = sheet.getRow(i);
if (cells != null && cells.length > 0) {
// A.團購ID
if (0 < cells.length) {
cell = cells[0];
} else {
cell = null;
}
if (cell != null) {
grId = Utils.toInput(cell.getContents());
if (Utils.isBlank(grId)) {
fail++;
failBuf.append((i + 1) + ";");
continue;
}
groupId = Utils.intValue(grId, -1);
if (groupId <= 0 || null == groupService.findGroup(groupId)) {
fail++;
notExistsBuf.append((i + 1) + ";");
continue;
}
} else {
fail++;
failBuf.append((i + 1) + ";");
continue;
}
// B.商品ID
if (1 < cells.length) {
cell = cells[1];
} else {
cell = null;
}
if (cell != null) {
goId = Utils.toInput(cell.getContents());
if (Utils.isBlank(goId)) {
fail++;
failBuf.append((i + 1) + ";");
continue;
}
goodsId = Utils.intValue(goId, -1);
if (goodsId <= 0 || null == goodsService.findGoods(goodsId)) {
fail++;
notExistsBuf.append((i + 1) + ";");
continue;
}
} else {
fail++;
failBuf.append((i + 1) + ";");
continue;
}
// C.馬甲ID
if (2 < cells.length) {
cell = cells[2];
} else {
cell = null;
}
if (cell != null) {
uId = Utils.toInput(cell.getContents());
if (Utils.isBlank(uId)) {
fail++;
failBuf.append((i + 1) + ";");
continue;
}
userId = Utils.intValue(uId, -1);
Account account = userService.findAccount(userId);
if (account == null) {
fail++;
notExistsBuf.append((i + 1) + ";");
continue;
}
} else {
fail++;
failBuf.append((i + 1) + ";");
continue;
}
// D.評論時間
if (3 < cells.length) {
cell = cells[3];
} else {
cell = null;
}
if (cell != null) {
date = Utils.toInput(cell.getContents());
if (Utils.isBlank(date)) {
fail++;
failBuf.append((i + 1) + ";");
continue;
}
date = date.replace("/", "-");
boolean isDate = Utils.isValidDate(date);
if (isDate == true) {
createAt = Utils.parseToDate(date, "yyyy-MM-dd HH:mm:ss");
}
if (createAt == null) {
fail++;
ruleBuf.append((i + 1) + ";");
continue;
}
} else {
fail++;
failBuf.append((i + 1) + ";");
continue;
}
// E.評論
if (4 < cells.length) {
cell = cells[4];
} else {
cell = null;
}
if (cell != null) {
content = Utils.toInput(cell.getContents());
if (Utils.isBlank(content)) {
fail++;
failBuf.append((i + 1) + ";");
continue;
}
if (content.length() > 1000) {
fail++;
lengthBuf.append((i + 1) + ";");
continue;
}
} else {
fail++;
failBuf.append((i + 1) + ";");
continue;
}
// F.圖片URL1
if (5 < cells.length) {
cell = cells[5];
} else {
cell = null;
}
if (cell != null) {
url1 = Utils.toInput(cell.getContents());
if (!Utils.isBlank(url1)) {
if (url1.length() > 255) {
fail++;
lengthBuf.append((i + 1) + ";");
continue;
}
str.add(url1);
}
}
// G.圖片URL2
if (6 < cells.length) {
cell = cells[6];
} else {
cell = null;
}
if (cell != null) {
url2 = Utils.toInput(cell.getContents());
if (!Utils.isBlank(url2)) {
if (url2.length() > 255) {
fail++;
lengthBuf.append((i + 1) + ";");
continue;
}
str.add(url2);
}
}
// H.圖片URL3
if (7 < cells.length) {
cell = cells[7];
} else {
cell = null;
}
if (cell != null) {
url3 = Utils.toInput(cell.getContents());
if (!Utils.isBlank(url3)) {
if (url3.length() > 255) {
fail++;
lengthBuf.append((i + 1) + ";");
continue;
}
str.add(url3);
}
}
// I.圖片URL4
if (8 < cells.length) {
cell = cells[8];
} else {
cell = null;
}
if (cell != null) {
url4 = Utils.toInput(cell.getContents());
if (!Utils.isBlank(url4)) {
if (url4.length() > 255) {
fail++;
lengthBuf.append((i + 1) + ";");
continue;
}
str.add(url4);
}
}
// J.圖片URL5
if (9 < cells.length) {
cell = cells[9];
} else {
cell = null;
}
if (cell != null) {
url5 = Utils.toInput(cell.getContents());
if (!Utils.isBlank(url5)) {
if (url5.length() > 255) {
fail++;
lengthBuf.append((i + 1) + ";");
continue;
}
str.add(url5);
}
}
int hasImg = 0;
if (null != str && str.size() > 0) {
hasImg = 1;
}
comment = new Comment();
comment.setGroupId(groupId);
comment.setGoodsId(goodsId);
comment.setUserId(userId);
comment.setStatus(Comment.STATUS_NORMAL);
comment.setContent(content);
comment.setCreateAt(createAt);
comment.setHasImg(hasImg);
commentId = commentService.createComment(comment);
for (String url : str) {
commentImg = new CommentImg();
commentImg.setCommentId(commentId);
commentImg.setImgUrl(url);
commentImg.setCreateBy(userId);
commentService.createCommentImg(commentImg);
}
count++;
}
}
}
}
}
resp.setCharacterEncoding("UTF-8");
msg = "成功導入" + count + "條評論,失敗" + ((0 > fail) ? 0 : fail) + "條! ";
if (fail > 0) {
statusCode = 300;
msg += "原因:";
if (!Utils.isBlank(failBuf.toString())) {
msg += "必填項是否爲空;行號爲:" + failBuf.toString() + ";";
}
if (!Utils.isBlank(notExistsBuf.toString())) {
msg += "團購ID或商品ID或馬甲ID不存在;行號爲:" + notExistsBuf.toString() + ";";
}
if (!Utils.isBlank(lengthBuf.toString())) {
msg += "評論內容或圖片url長度太長;行號爲:" + lengthBuf.toString() + ";";
}
if (!Utils.isBlank(ruleBuf.toString())) {
msg += "評論時間格式不對;行號爲:" + ruleBuf.toString() + ";";
}
}
if (fail == 0) {
showMessage(req, resp, statusCode, msg, true, true);
} else {
showMessage(req, resp, statusCode, msg, false, false);
}
return null;
}
注意:傳統文件上傳方式需要在.xml文件配置文件上傳監聽multipartResolver,每次文件上傳都會被監聽到並先進行一次內容解析,再將解析後的內容傳到controller層進行處理,而新方式是直接在controller層進行解析再處理,所以無需配置監聽,若配置了監聽二次解析是獲取不到文件內容的。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="2000000"/>
</bean>