2018年1月28日
功能:利用Springmvc 实现单文件上传;使用了MultipartResolver接口;
【0】MultipartResolver接口用于处理上传请求,将上传请求包装成了可以获取文件的数据,大大方便了操作;它有两个实现类:CommonsMultipartResolver 和 StandardservletMultipartResolver。
后者(StandardservletMultipartResolver)使用了Servlet3.0标准的上传方式;
前者(CommonsMultipartResolver )使用了Apache的commons-fileupload 来完成具体的上传操作;我下面使用的是CommonsMultipartResolver ;
【1】项目jar包与文件框架
图1
图2
为了方便理解,先从简单的View入手,再到Controller、Service 与 Dao层,最后是数据库Mysql;
【2】View层,在useradd.jsp添加了以下代码:
<h5>以下为上传-单文件测试</h5>
<form action="${pageContext.request.contextPath }/user/upload" method="post" enctype="multipart/form-data">
<input type="hidden" id="errorinfo" value="${uploadFileError}">
文件:<input type="file" name="uploadFile"/><br/><br/>
<input type="submit" value="上传"/>
</form>
注意之处:1、enctype="multipart/form-data",指定表单内容的类型,支持文件上传;2、<input type="file" name="uploadFile"/>,file组件。
显示效果:
图3
图4(testfile1.png)
注意之处:1、文件名要全英文,中文可能会在传输乱码或者报错! 2、文件路径要全英文,中文可能会在传输乱码或者报错!
【3】需要在springmvc配置文件进行MultipartResolver注册(springmvc-servlet.xml):
<!-- 配置MultipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000"></property>
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
注意之处:1、这里设置了请求的编码格式,设置为UTF-8,要和JSP的pageEncoding设置一样,才能便于读取;2、maxUploadSize,上传文件的大小上限,单位是字节(Byte);
【4】Controller控制器,主要是对文件上传确定后的一些后台处理(文件名称、大小、格式是否合格),因此,只需要在UserController.java文件添加处理方法:
@RequestMapping(value="/upload" ,method=RequestMethod.POST)
public String test(HttpSession session ,HttpServletRequest request,
MultipartFile uploadFile) throws Exception, IOException{
System.out.println("test==");
String idPicPath = null;
if(!(uploadFile.isEmpty())){
System.out.println("begin attaching...");
//获取保存文件的绝对路径
String path = request.getSession().getServletContext().getRealPath("statics"+File.separator+"uploadfiles");
System.out.println("2.1 uploadFile path ===>"+path);
//获取上传文件的文件名
String oldFileName = uploadFile.getOriginalFilename();//原文件名
System.out.println("2.2 uploadFile oldFileName ===>"+oldFileName);
//获取文件名后缀
String prefix = FilenameUtils.getExtension(oldFileName);//原文件名后缀
System.out.println("2.3 uploadFile prefix ===>"+prefix);
//设置文件大小的变量,KB是单位
int filesize = 5000000;
System.out.println("2.4 uploadFile filesize ===>"+uploadFile.getSize());
if(uploadFile.getSize() > filesize){
request.setAttribute("uploadFileError", "* 上传大小不得超过5000KB");
System.out.println("* 上传大小不得超过5000KB");
return "useradd";
}else if(prefix.equalsIgnoreCase("jpg")
|| prefix.equalsIgnoreCase("png")
|| prefix.equalsIgnoreCase("jpeg")
|| prefix.equalsIgnoreCase("pneg")){
//上传格式正确,重命名文件
String fileName = System.currentTimeMillis()+RandomUtils.nextInt(1000000)+"_Personal.jpg";
System.out.println("2.5 new fileName===>"+uploadFile.getName());
//新建这么一个文件,FILE API
File targetFile = new File(path,fileName);
if(!targetFile.exists()){
targetFile.mkdirs();
}
//保存
try{
//上传
uploadFile.transferTo(targetFile);
}catch (Exception e){
e.printStackTrace();
request.setAttribute("uploadFileError", "* 上传失败! ");
System.out.println("* 上传失败! ");
return "useradd";
}
idPicPath = path+File.separator+fileName;
}else{
request.setAttribute("uploadFileError", "* 上传格式错误!");
System.out.println("* 上传格式错误!");
return "useradd";
}
// //获取文件名字作保存在服务器的文件名
// String filename = uploadFile.getOriginalFilename();
//
// //前半部分,目录,将WebRoot下一个名称为image的文件夹 转化为绝对路径
// String leftPath = session.getServletContext().getRealPath("statics");
// //进行路径拼接
// File file = new File(leftPath,filename);
// System.out.println("file path: "+file.getPath());
// //把 MultipartFile 文件流的数据输出到目标文件
// uploadFile.transferTo(file);
}
User user = new User();
user.setIdPicPath(idPicPath);
System.out.println("user.idPicPath: "+ user.getIdPicPath());
return "userlist";
}
解释:(1)上面用到的API 可以参考开发手册去理解用法:
1.FilenameUtils:getExtension(oldFileName),来自
2.MultipartFile:getOriginalFilename()、isEmpty()、
3.session.getServletContext().getRealPath()
4.File.separator
(2)RandomUtils 工具类的使用,需要导入jar包:
【5】测试结果:
打印日志:
begin attaching...
2.1 uploadFile path ===>D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles
2.2 uploadFile oldFileName ===>testfile1.png
2.3 uploadFile prefix ===>png
2.4 uploadFile filesize ===>138624
2.5 new fileName===>uploadFile
user.idPicPath: D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles\1517554236373_Personal.jpg
文件结构:
图5
【6】改进之处:因为很多时候,不仅仅只是上传文件,还需要传递别的数据,所以之后的博文会继续讲到相关内容。