开发工具与关键技术:Java/MyEclipse 10
作者:张俊辉
撰写时间:2019年07月08日
本文使用两个jar包,分别是:commons-fileupload-1.3.2.jar、与commons-io-2.5.jar
前端使用Layui上传文件并调用servlet方法InputtingExcelPreview,也可以自行写入方法上传文件并调用方法InputtingExcelPreview。
使用Layui需要设置的参数有:auto:true选完文件自动上传、accept:‘file’ 上传文件类型设置为所有文件、exts:‘xls|xlsx’、限制文件后缀名为.xls或.xlsx,请求成功后弹出后台请求状态并判断当解析后的Excel表格数据符合条件的大于0弹出预览数据模态框、点击确定导入调用后台方法InputtingExcel保存入数据库。
InputtingExcelPreview方法的书写方式与主要作用:该方法主要是保存文件并把文件传递到的SupplierService类中的InputtingExcelPreview方法,解析数据后写入到ReturnListJson类中返回到页面。
首先需要将上传的文件保存到临时文件夹,这里需要引入commons-fileupload-1.3.2.jar、与commons-io-2.5.jar。
然后需要实例化一个DiskFileItemFactor类,然后通过该实例设置内存临界值并配置临时目录代码如下:
int sizeThreshold=1024*1024*10; //10MB
DiskFileItemFactory factory=new DiskFileItemFactory();
// 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中 10M
factory.setSizeThreshold(sizeThreshold);
//配置临时目录
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
然后实例化ServletFileUpload类设置文件上传最大值、编码、请求的最大值,代码如下:
int fileSizeMax=1024*1024*100; //100M
int sizeMax=1024*1024*300; //300M
ServletFileUpload upload=new ServletFileUpload(factory);
//设置编码upload.setHeaderEncoding("utf-8");
//设置上传文件的最大大小upload.setFileSizeMax(fileSizeMax);
//设置请求的最大大小upload.setSizeMax(sizeMax);
接下来需要构造临时路径来存储上传的文件,代码如下:
// 构造临时路径来存储上传的文件,这个路径相对当前应用的目录
String uploadPath=request.getServletContext().getRealPath("./")+File.separator+"upload";
// 如果目录不存在则创建
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
获取上传的文件序列循环遍历后逐一保存到磁盘,并调用supplierService中的InputtingExcelPreview并传入文件,把返回数据中的data保存到Session中并把返回的数据发送到前端页面 :
List<FileItem> formItems = upload.parseRequest(request);
for (FileItem item : formItems) {
//isFormField 表单元素
if (!item.isFormField()) {
String fileName =System.currentTimeMillis()+"__"+ new File(item.getName()).getName();
String filePath = uploadPath + File.separator + fileName;
File file = new File(filePath);
// 保存文件到硬盘
item.write(file);
if("supplierLinkmam".equals(inputtingType)){
ISupplierService supplierService =new SupplierServiceImpl(); ReturnListJson<SelectSupplierVo>listJson=supplierService.InputtingExcelPreview(file);
if(listJson.getData().size()>0){
request.getSession().removeAttribute("listData");
request.getSession().setAttribute("listData", listJson.getData());
}
jsonObj=JSONObject.fromObject(listJson);
PrintWriter out=response.getWriter();
out.write(jsonObj.toString());
out.flush();
out.close();
}
}
返回格式为封装的ReturnListJson类如下,其中code储存的是返回的状态,最好可以和Layui的弹框图标对应常用的有(0代表警告,1代表成功,2代表失败,3代表询问)msg储存的是提示的内容count代表的是总条数(在分页时需要用到这里可以赋值为0),data储存的是解析后符合条件的数据的数据:
public class ReturnListJson<T> {
private int code;
private String msg;
private int count;
private List<T> data;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
}
public ReturnListJson(int code,String msg,int count,List<T> data){
this.code=code;
this.data=data;
this.msg=msg;
this.count=count;
}
}