文件上传(导入市场活动)

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");

					}
				}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值