本篇文章主要讲解文件上传功能的代码教程:
配合文件下载代码教程更佳。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<html>
<head>
<base href="<%=basePath%>">
<title>演示文件上传</title>
</head>
<body>
<!--
文件上传的表单三个条件:
1.表单组件标签必须用:<input type="file">
<input type="text|password|radio|checkbox|hidden|button|submit|reset|file">
<select>,<textarea>等
2.请求方式只能用:post
get:参数通过请求头提交到后台,参数放在URL后边;只能向后台提交文本数据;对参数长度有限制;数据不安全;效率高
post:参数通过请求体提交到后台;既能能提交文件数据,又能够提交二进制数据;理论上对参数长度没有限制;相对安全;效率相对较低
3.表单的编码格式只能用:multipart/form-data
根据HTTP协议的规定,浏览器每次向后台提交参数,都会对参数进行统一编码;默认采用的编码格式是urlencoded,这种编码格式只能对文本数据进行编码;
浏览器每次向后台提交参数,都会首先把所有的参数转换成字符串,然后对这些数据统一进行urlencoded编码;
文件上传的表单编码格式只能用multipart/form-data:enctype="multipart/form-data"
-->
<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="提交">
</form>
</body>
</html>
/**
* 配置springmvc的文件上传解析器
*
*/
@RequestMapping("/workbench/activity/fileUpload.do")
public @ResponseBody Object fileUpload(String userName, MultipartFile myFile) throws Exception{
//把文本数据打印到控制台
System.out.println("userName="+userName);
//把文件在服务指定的目录中生成一个同样的文件
String originalFilename=myFile.getOriginalFilename();
File file=new File("D:\\course\\18-CRM\\阶段资料\\serverDir\\",originalFilename);//路径必须手动创建好,文件如果不存在,会自动创建
myFile.transferTo(file);
//返回响应信息
ReturnObject returnObject=new ReturnObject();
returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
returnObject.setMessage("上传成功");
return returnObject;
}
@RequestMapping("/workbench/activity/importActivity.do")
public @ResponseBody Object importActivity(MultipartFile activityFile,String userName,HttpSession session){
System.out.println("userName="+userName);
User user=(User) session.getAttribute(Contants.SESSION_USER);
ReturnObject returnObject=new ReturnObject();
try {
//把excel文件写到磁盘目录中
/*String originalFilename = activityFile.getOriginalFilename();
File file = new File("D:\\course\\18-CRM\\阶段资料\\serverDir\\", originalFilename);//路径必须手动创建好,文件如果不存在,会自动创建
activityFile.transferTo(file);*/
//解析excel文件,获取文件中的数据,并且封装成activityList
//根据excel文件生成HSSFWorkbook对象,封装了excel文件的所有信息
//InputStream is=new FileInputStream("D:\\course\\18-CRM\\阶段资料\\serverDir\\"+originalFilename);
InputStream is=activityFile.getInputStream();
HSSFWorkbook wb=new HSSFWorkbook(is);
//根据wb获取HSSFSheet对象,封装了一页的所有信息
HSSFSheet sheet=wb.getSheetAt(0);//页的下标,下标从0开始,依次增加
//根据sheet获取HSSFRow对象,封装了一行的所有信息
HSSFRow row=null;
HSSFCell cell=null;
Activity activity=null;
List<Activity> activityList=new ArrayList<>();
for(int i=1;i<=sheet.getLastRowNum();i++) {//sheet.getLastRowNum():最后一行的下标
row=sheet.getRow(i);//行的下标,下标从0开始,依次增加
activity=new Activity();
activity.setId(UUIDUtils.getUUID());
activity.setOwner(user.getId());
activity.setCreateTime(DateUtils.formateDateTime(new Date()));
activity.setCreateBy(user.getId());
for(int j=0;j<row.getLastCellNum();j++) {//row.getLastCellNum():最后一列的下标+1
//根据row获取HSSFCell对象,封装了一列的所有信息
cell=row.getCell(j);//列的下标,下标从0开始,依次增加
//获取列中的数据
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.saveCreateActivityByList(activityList);
returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
returnObject.setRetData(ret);
}catch (Exception e){
e.printStackTrace();
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("系统忙,请稍后重试....");
}
return returnObject;
}
如下代码被注释掉,是为了节省我们计算的效率,具体可参考文件下载代码教程
优化前:如下代码的图解
//把excel文件写到磁盘目录中
/*String originalFilename = activityFile.getOriginalFilename();
File file = new File("D:\\course\\18-CRM\\阶段资料\\serverDir\\", originalFilename);//路径必须手动创建好,文件如果不存在,会自动创建
activityFile.transferTo(file);*/
//解析excel文件,获取文件中的数据,并且封装成activityList
//根据excel文件生成HSSFWorkbook对象,封装了excel文件的所有信息
//InputStream is=new FileInputStream("D:\\course\\18-CRM\\阶段资料\\serverDir\\"+originalFilename);
优化后代码图解:
我们选择用如下代码代替:
InputStream is=activityFile.getInputStream();