1.文件上传 表单组件标签使用 file
<input type="file>
2.请求方式是post
get请求:参数通过请求头提交到后台,参数放url后边
只能提交文本数据(字符串) 对参数长度有限制,参数不安全
效率高,访问同一个地址,浏览器走缓存
post请求:参数 通过请求体提交到后台
既能提交文本数据,也能提交二进制数据
3.表单的编码格式:multipart/form-data
根据HTTP协议规定,浏览器每次向后台提交参数都会对参数进行统一编码,
默认urlencoded,这种编码格式只能对文本数据(字符串)编码,浏览器每次向
后台提交数据,都会首先把参数转换成字符串,然后对这些数据统一经行urlencoded编码
文件上传格式只能用multipart/form-data.
测试文件上传
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"; %> <html> <head> <base href="<%=basePath%>"> <meta charset="UTF-8"> <title>演示文件上传</title> </head> <body> <form action="workbench/activity/fileUpload.do" method="post" enctype="multipart/form-data"> <input type="file" name="myFile"> <br> <input type="text" name="userName"> <br> <input type="submit" value="提交上传"> <br> </form> </body> </html>
type='file' springmvc提供类解析文件
<!--配置文件上传解析器: id必须是 multipartResolver--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="#{1024*1024*80}"/> <property name="defaultEncoding" value="utf-8"/> </bean>
编写Controller层
@RequestMapping("/workbench/activity/fileUpload.do") @ResponseBody public Object fileUpload(String userName, MultipartFile myFile) throws IOException { // 把文本数据打印到控制台 System.out.println(userName+"username"); //把文件在服务器指定的目录生成一个同样的文件 String originalFilename = myFile.getOriginalFilename(); File file=new File("C:\\Users\\12720\\Downloads",originalFilename); //路径必须手动创建好 myFile.transferTo(file); //返回响应信息 ReturnObject returnObject=new ReturnObject(); returnObject.setCode("1"); returnObject.setMessage("上传成功"); return returnObject; }
把导入的excel文件市场活动表信息 封装成activity 的list集合 批量导入数据库
mapper层
int insertActivityByList(List<Activity> activityList);<insert id="insertActivityByList" parameterType="com.bjpowernode.crm.workbench.domain.Activity" > insert into tbl_activity(id, owner, name, start_date, end_date, cost, description, create_time, create_by ) values <foreach collection="list" separator="," item="obj"> (#{obj.id},#{obj.owner},#{obj.name},#{obj.startDate},#{obj.endDate}, #{obj.cost},#{obj.description},#{obj.createTime},#{obj.createBy}) </foreach> </insert>
批量插入activity表市场活动信息
Service 接口和实现类
int insertActivityByList(List<Activity> activityList);public int insertActivityByList(List<Activity> activityList) { return activityMapper.insertActivityByList(activityList); }
Controller层
获取参数上传的文件参数 把文件写到服务器磁盘目录下 解析excel文件把数据封装成activityList 把activityList插入数据库
/*导入市场活动文件*/ @RequestMapping("/workbench/activity/importActivity.do") @ResponseBody public Object importActivity(MultipartFile activityFile,HttpSession session) throws IOException { User user = (User) session.getAttribute("user"); ReturnObject returnObject=new ReturnObject(); try{ //把excel文件写道磁盘目录中 String originalFilename = activityFile.getOriginalFilename(); File file=new File("C:\\Users\\12720\\Downloads",originalFilename); activityFile.transferTo(file); //解析excel文件 获取文件中的数据 并且封装成activityList InputStream is = new FileInputStream("C:\\Users\\12720\\Downloads"+originalFilename); HSSFWorkbook wb=new HSSFWorkbook(is); HSSFSheet sheetAt = wb.getSheetAt(0); HSSFRow row=null; HSSFCell cell=null; List<Activity> activityList=new ArrayList<>(); for(int i=1;i<=sheetAt.getLastRowNum();i++){ row = sheetAt.getRow(i); Activity activity=new Activity(); activity.setId(UUID.randomUUID().toString()); activity.setOwner(user.getId()); activity.setCreateBy(user.getId()); activity.setCreateTime(DateUtils.formateDateTime()); for(int j=0;j<row.getLastCellNum();j++){ cell = row.getCell(j); String cellValue = HSSFUtils.getCellValueForStr(cell); if (j==0){ activity.setName(cellValue); } else if (j==1) { activity.setStartDate(cellValue); } else if (j==2){ activity.setEndDate(cellValue); } else if (j==3) { activity.setCost(cellValue); }else if (j==4) { activity.setDescription(cellValue); } } //每一行中所有列都封装完成之后, 把activity保存到list中 activityList.add(activity); } //调用service层方法 保存市场活动列表数据 int ret= activityService.insertActivityByList(activityList); returnObject.setCode("1"); returnObject.setRetDate(ret); }catch (Exception e){ returnObject.setCode("0"); returnObject.setMessage("保存市场活动有误"); } return returnObject; } public class HSSFUtils { public static String getCellValueForStr(HSSFCell cell){ String ret=""; if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING) { ret= cell.getStringCellValue(); }else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC) { ret=cell.getNumericCellValue()+""; }else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){ ret=cell.getBooleanCellValue()+""; }else if(cell.getCellType()==HSSFCell.CELL_TYPE_FORMULA){ ret=cell.getCellFormula(); }else { ret=""; } return ret; } }
把文件写入磁盘和解析文件优化不写入磁盘 直接内存中拿取
InputStream is = activityFile.getInputStream(); HSSFWorkbook wb=new HSSFWorkbook(is);
/*使用apache-poi解析excel文件*//*使用apache-poi解析excel文件*/ public class ParseExcel { public static void main(String[] args) throws IOException { //文件已存在 根据excel文件生成HSSFWorkbook对象 //封装成excel文件 InputStream is = new FileInputStream("C:\\Users\\12720\\Downloads\\activityList.xls"); HSSFWorkbook wb = new HSSFWorkbook(is); //根据wb获取HSSFSheet对象 封装了某一页的数据 HSSFSheet sheetAt = wb.getSheetAt(0); //页下标 //循环 HSSFRow row=null; HSSFCell cell=null; for(int i=0;i<=sheetAt.getLastRowNum();i++){ //sheet.getLastRowNum最后一行下标 row = sheetAt.getRow(i); //行下标 for (int j=0;j<row.getLastCellNum();j++){//row.getLastCellNum最后一列下标+1 cell = row.getCell(j);//列下标 //获取列中的数据 /* System.out.print(getCellValueForStr(cell)+" "); */ System.out.print(HSSFUtils.getCellValueForStr(cell)); } //每一行中所有列都打完 打印一个换行 System.out.println(); } } /*从指定的HSSFCell对象获取列的值*/ public static String getCellValueForStr(HSSFCell cell){ String ret=""; if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING) { ret= cell.getStringCellValue(); }else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC) { ret=cell.getNumericCellValue()+""; }else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){ ret=cell.getBooleanCellValue()+""; }else if(cell.getCellType()==HSSFCell.CELL_TYPE_FORMULA){ ret=cell.getCellFormula(); }else { ret=""; } return ret; } }
客户端
用户点击导入按钮 $("#importActivityBtn").click(function(){} 弹出导入市场活动模态窗口 用户点击导入按钮(异步请求) 用户选择要导入的excel文件: 收集参数(文件名)判断文件类型 是不是xls文件 var activityFileName= $("#activityFile").val(); 根据substr(activityFileName.lastIndexOf(".")+1) xls str.substr(startIndex)//从下标为startIndex的字符开始截取,截取到字符串的最后 "C:\Users\User\Downloads\studentList.xls" 根据document元素获取文件:判断文件大小不能超过10MB var activityFile=$("#activityFile")[0].files[0]; 把接收的参数ajax发送到Controller层 发送的url:workbench/activity/importActivity.do 发送的data不是字符串 是二进制文件流 创建FormData()对象 保存文件 var formData=new FormData(); formData.append("activityFile",activityFile);//二进制文件 设置字符编码 processData: false,//默认情况下 设置ajax向后台提交参数是否把参数统一 //转成字符串 默认ture contentType:false, //设置ajax向后台提交参数是否按urlencoded编码 文件上传 :file标签 post请求 上传格式只能用multipart/form-data//给导入按钮添加单击事件 $("#importActivityBtn").click(function(){ //收集参数 var activityFileName= $("#activityFile").val(); if(activityFileName.substr(activityFileName.lastIndexOf(".")+1).toLocaleLowerCase()!="xls"){ alert("只支持xls文件"); return; } var activityFile=$("#activityFile")[0].files[0]; if(activityFile.size>10*1024*1024){ alert("文件大小不能超过10MB"); return ; } //FormData 是ajax提供的接口 ,可以模拟键值对向后台提交参数 //最大的优势不但能提交文本数据,还能提交二进制数据 var formData=new FormData(); formData.append("activityFile",activityFile);//二进制文件 formData.append("userName","张三"); //发送ajax $.ajax({ url:'workbench/activity/importActivity.do', data:formData, processData: false,//默认情况下 设置ajax向后台提交参数是否把参数统一 //转成字符串 默认ture contentType:false, //设置ajax向后台提交参数是否按urlencoded编码 type:'post', dataType:'json', success:function (data){ if (data.code=="1"){ alert("成功导入"+data.retDate+"条记录"); //关闭模态窗口 $("#importActivityModal").modal("hide"); queryActivityByConditionForPage(1,$("#demo_pag1").bs_pagination('getOption','rowsPerPage')); }else { alert(data.message); $("#importActivityModal").modal("show"); } } }) });
解析json渲染页面接受到controller层的json数据 调用success(data){}
success:function (data){ if (data.code=="1"){ alert("成功导入"+data.retDate+"条记录"); //关闭模态窗口 $("#importActivityModal").modal("hide"); queryActivityByConditionForPage(1,$("#demo_pag1").bs_pagination('getOption','rowsPerPage')); }else { alert(data.message); $("#importActivityModal").modal("show"); } }