参考文章:
https://www.cnblogs.com/yunliu0603/p/9504756.html
https://www.cnblogs.com/tengyunhao/p/7670293.html
注意:
单文件 MultipartFile file;
多文件 MultipartFile[] file;
判断文件是否为空:!file.isEmpty() --->不为空
获取上传文件名:String originalFilename = file.getOriginalFilename() 包括文件名的后缀
文件保存路径:String filePath = request.getServletContext().getRealPath("/") + "upload/" + originalFilename
初始化文件信息:File newFile = new File(filePath)
创建目录:newFile.getParentFile().mkdir()
转存文件:file.transferTo(newFile)
步骤:
1.编写一个控制类;
2.编写提交表单的 action 方法,并使用 SpringMVC 注解 @RequestParam 来指定表单中的 file 参数;
3.指定一个用于保存文件的 web项目路径;
4.通过 MultipartFile 的 transferTo() 来转存文件到相应的路径;
5.编写 form 表单;
6.在 springMVC 配置文件中,定义文件上传解析器;
springMVC配置文件:
MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 MultipartResolver 的 isMultipart() 方法判断请求中是否包含文件。如果请求数据中包含文件,则调用 MultipartResolver 的 resolveMultipart() 方法对请求的数据进行解析,然后将文件数据解析成 MultipartFile 并封装在 MultipartHttpServletRequest (继承了 HttpServletRequest) 对象中,最后传递给 Controller。
MultipartResolver 是一个接口,它的实现类如下图所示,分为 CommonsMultipartResolver 类和 StandardServletMultipartResolver 类。
其中 CommonsMultipartResolver 使用 commons Fileupload 来处理 multipart 请求,所以在使用时,必须要引入相应的 jar 包;
而 StandardServletMultipartResolver 是基于 Servlet 3.0来处理 multipart 请求的,所以不需要引用其他 jar 包,但是必须使用支持 Servlet 3.0的容器才可以,以tomcat为例,从 Tomcat 7.0.x的版本开始就支持 Servlet 3.0了。
关于 MultipartResolver 的具体讲解,参考: https://www.cnblogs.com/tengyunhao/p/7670293.html
1、接收前端上传的文件
/**
* 接收多文件
*/
@RequestMapping("/upload")
public R uploadFile(@RequestParam Map<String, Object>params, HttpServletRequest request) {
// 复杂类型的request对象
MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request
// 获取文件名集合放入迭代器
Iterator<String>files = mRequest.getFileNames()
while (files.hasNext()) {
// 获取上传文件的对象
MultipartFile mFile = mRequest.getFile(files.next())
if (mFile != null) {
//原始文件名称
String oldfile = mFile.getOriginalFilename()
//文件后缀
String suffix = oldfile.substring(oldfile.indexOf('.'), oldfile.length())
String suffix2 = oldfile.substring(oldfile.indexOf('.')+1, oldfile.length())
/***************文件处理*********************/
}
}
}
2.接收前端上传的文件
/**
* 接收附件
* @param request
* @return
*/
@ResponseBody
@RequestMapping(value="fileupload",method=RequestMethod.POST)
public void springUpload(HttpServletRequest request) {
//将当前上下文初始化给 CommonsMutipartResolver (多部分解析器)
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(
request.getSession().getServletContext())
//检查form中是否有enctype="multipart/form-data"
if(multipartResolver.isMultipart(request)) {
//将request变成多部分request
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request
//获取multiRequest 中所有的文件名
Iterator iter=multiRequest.getFileNames()
while(iter.hasNext()){
//一次遍历所有文件
MultipartFile file=multiRequest.getFile(iter.next().toString())
//最初上传文件名的文件名
String oldFilename = file.getOriginalFilename()
//获取初始文件名后缀
String fileSuffix = oldFilename.substring(oldFilename.lastIndexOf(".") +1)
/***************文件处理*********************/
}
}
3.接收前端上传的文件
/**
* 接收文件
*
*
* @param model
* @return
* @throws IOException
* @throws IllegalStateException
*/
@RequestMapping(value = "imageupload")
public void imageUpload(MultipartFile file) throws IllegalStateException, IOException {
//文件名称
String realFileName = file.getOriginalFilename()
//文件后缀
String suffix = realFileName.substring(realFileName.lastIndexOf(".") + 1)
/***************文件处理*********************/
}
前端限制,用 正则匹配文件名后缀 /\.([jJ][pP][gG]){1}$|\.([jJ][pP][eE][gG]){1}$|\.([gG][iI][fF]){1}$|\.([pP][nN][gG]){1}$|\.([bB][mM][pP]){1}$/ 这个是图片正则匹配
服务端获取文件,用正则匹配文件名后缀
MultipartHttpServletRequest mrequest = (MultipartHttpServletRequest) requestMultipartFile file = mrequest.getFile("file")
if (file != null && !file.isEmpty()) {
// 获得文件类型(可以判断如果不是指定类型,禁止上传)
String contentType = file.getContentType()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)