技术准备:
1.文件上传
fileuploadtest.jsp
<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
post:参数写在请求体里面,既能提交文本数据,也可以提交二进制数据;长度理论上没有限制,不能使用缓存
get:参数写在url上,url在请求头上,只能向后台提交文本数据;对参数长度有限制,可以使用缓存
3.表单的编码格式只能用:multipart/from-data
根据HTTP协议的规定,浏览器每次向后台提供参数,都会对参数进行统一编码了、;默认的编码是urlencoded,这种编码格式只能对文本数据进行编码
浏览器每次向后台提交参数,都先会把参数转换成字符串,然后对这些数据同一进行编码;
--%>
<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>
controller层-》fileUpload()
springmvc的配置文件:
<!-- 配置文件上传解析器 id:必须是multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="#{1024*1024*5}"/>
<property name="defaultEncoding" value="utf-8"/>
</bean>
controller:
/*注意:
* 这里需要先在springMVC中的配置文件中先配置文件上传解析器
* 用于从前端放在响应体中的文件解析出来才能放到controller层接收*/
//测试文件上传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("D:\\实践项目\\CRM后台系统\\serverDir\\"+originalFilename);
myFile.transferTo(file);
//返回信息
ReturnObject returnObject=new ReturnObject();
returnObject.setMessage("上传成功");
returnObject.setCode(Constant.RETURN_OBJECT_CODE_SUCCESS);
return returnObject;
}
2.使用Java解析excel文件:使用apache-poi
//使用apache-poi解析excel文件
public class ParseExcelTest {
public static void main(String[] args) throws IOException {
//根据excel文件生成HSSFWorkbook对象,封装了excel文件哎都所有信息
InputStream is = new FileInputStream("D:\\实践项目\\CRM后台系统\\serverDir\\studentList.xls");
HSSFWorkbook wb = new HSSFWorkbook(is);
//根据wb获取HSSFSheet对象,封装了一页的所有信息
HSSFSheet sheet = wb.getSheetAt(0);//页下标,下标从零开始
//根据sheet获取HSSFSheet获取行
HSSFRow row=null;
HSSFCell cell=null;
for (int i=0;i<=sheet.getLastRowNum();i++){//sheet.getLastRowNum()最后一行的下标
row = sheet.getRow(i);//行下标,从零开始
for (int j=0;j<row.getLastCellNum();j++){//row.getLastCellNum()最后一列下标+1
//根据row对象获取HSSFCell对象,,封装一列的信息
cell = row.getCell(j);//列下标,从零开始
//获取列中的数据
System.out.print(HSSFUtils.getCellValueForStr(cell)+" ");
}
//每一行中所有列都打完,打印一个换行
System.out.println();
}
}
}
工具类:
/**
* 关于excel文件操作的工具类
*/
public class HSSFUtils {
/**
* 从指定的HSSFCell对象中获取列的值
* @return
*/
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;
}
}
注:使用Ajax向后台提交文件注意要设置是否要转成字符串和是否要进行encoded编码
并注意1.val()获取的是文件的名称,比对是否是所需文件格式要进行字符串的裁剪
str.substr(str.lastIndexOf(".")+1)//截取文件的后缀名
2.想要获取文件,需要从document中获得
其中有两种方式:1)document.getElementById()
2)$("按钮")[0].files[0]
//给批量导入的导入按钮添加单击事件
$("#importActivityBtn").click(function (){
//收集参数
var activityFileName=$("#activityFile").val();//获取文件名称
var suffix=activityFileName.substr(activityFileName.lastIndexOf(".")+1).toLocaleLowerCase();//截取字符串拿到后缀
if (suffix!="xls"){
alert("只支持xls文件!");
return ;
}
var activityFile=$("#activityFile")[0].files[0];//得到文件本身
//document.getElementById()
//验证文件大小
if (activityFile.size>5*1024*1024){
alert("文件大小不能超过5MB!");
return ;
}
//FormData这个是ajax提供的一个接口,相当于Java里面的类
//这个类可以模拟键值对向后台提供参数。优点就是字符串文本和二进制都可以提交
var formData=new FormData();
formData.append("activityFile",activityFile);
formData.append("userName","testName");
//发送请求
$.ajax({
url:'workbench/activity/importActivity.do',
data:formData,
type:'post',
contentType:false,//设置Ajax向后台提交参数之前,是否把所有的参数统一按urlencoded编码;
processData:false,//默认情况下,会将参数转译成字符串格式。
dataType:'json',
success:function (data){
if (data.code=="1"){
alert("成功导入"+data.retData+"条数据!");
$("#importActivityModal").modal("hide");
queryActivityByConditionForPage(1,$("#demo_pag1").bs_pagination('getOption', 'rowsPerPage'));
}else {
alert(data.message);
$("#importActivityModal").modal("show");
}
}
})
})