今天遇到一个坑,这里给大家介绍一下。
现在很多文件上传类型都是multipart/form-data类型的,HTTP请求如下所示:
可是问题就在于如果用传统的Struts2或者servlet等都可以很容易的实现文件接收的功能,例如下面的代码就可以实现:
- boolean isMultipart = ServletFileUpload.isMultipartContent(request);//判断是否是表单文件类型
- DiskFileItemFactory factory = new DiskFileItemFactory();
- ServletFileUpload sfu = new ServletFileUpload(factory);
- List items = sfu.parseRequest(request);//从request得到所有上传域的列表
- for(Iterator iter = items.iterator();iter.hasNext();){
- FileItem fileitem =(FileItem) iter.next();
- if(!fileitem.isFormField()&&fileitem!=null){//判读不是普通表单域即是file
- System.out.println("name:"+fileitem.getName());
- }
- }
可是今天我把这一段代码放在SpringBoot上面的时候就怎么也接收不到文件信息了,一直以为是前端什么数据传输错了。后来才知道原来SpringBoot有它自己的接收请求的代码。下面就给大家详细介绍一下它是如何实现这个功能的。
首选做一个简单的案例,也就是单个文件上传的案例。(这个案例是基于SpringBoot上面的,所以大家首先得搭建好SpringBoot这个框架)
前台HTML代码:
- <html>
- <body>
- <form action="/upload" method="POST" enctype="multipart/form-data">
- <input type="file" name="file"/>
- <input type="submit" value="Upload"/>
- </form>
- </body>
- </html>
后台接收代码:
- /**
- * 文件上传具体实现方法;
- *
- * @param file
- * @return
- */
- @RequestMapping("/upload")
- @ResponseBody
- public String handleFileUpload(@RequestParam("file") MultipartFile file) {
- if (!file.isEmpty()) {
- try {
- /*
- * 这段代码执行完毕之后,图片上传到了工程的跟路径; 大家自己扩散下思维,如果我们想把图片上传到
- * d:/files大家是否能实现呢? 等等;
- * 这里只是简单一个例子,请自行参考,融入到实际中可能需要大家自己做一些思考,比如: 1、文件路径; 2、文件名;
- * 3、文件格式; 4、文件大小的限制;
- */
- BufferedOutputStream out = new BufferedOutputStream(
- new FileOutputStream(new File(
- file.getOriginalFilename())));
- System.out.println(file.getName());
- out.write(file.getBytes());
- out.flush();
- out.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- return "上传失败," + e.getMessage();
- } catch (IOException e) {
- e.printStackTrace();
- return "上传失败," + e.getMessage();
- }
- return "上传成功";
- } else {
- return "上传失败,因为文件是空的.";
- }
- }
这样就可以实现对multipart/form-data类型文件的接收了。那如果是多个文件外加多个字段呢,下面接着看下一个多个文件上传的案例。
前台HTML界面:
- <!DOCTYPE html>
- <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
- xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
- <head>
- <title>Hello World!</title>
- </head>
- <body>
- <form method="POST" enctype="multipart/form-data" action="/batch/upload">
- <p>文件1:<input type="text" name="id" /></p>
- <p>文件2:<input type="text" name="name" /></p>
- <p>文件3:<input type="file" name="file" /></p>
- <p><input type="submit" value="上传" /></p>
- </form>
- </body>
- </html>
后台接收代码:
- @RequestMapping(value = "/batch/upload", method = RequestMethod.POST)
- @ResponseBody
- public String handleFileUpload(HttpServletRequest request) {
- MultipartHttpServletRequest params=((MultipartHttpServletRequest) request);
- List<MultipartFile> files = ((MultipartHttpServletRequest) request)
- .getFiles("file");
- String name=params.getParameter("name");
- System.out.println("name:"+name);
- String id=params.getParameter("id");
- System.out.println("id:"+id);
- MultipartFile file = null;
- BufferedOutputStream stream = null;
- for (int i = 0; i < files.size(); ++i) {
- file = files.get(i);
- if (!file.isEmpty()) {
- try {
- byte[] bytes = file.getBytes();
- stream = new BufferedOutputStream(new FileOutputStream(
- new File(file.getOriginalFilename())));
- stream.write(bytes);
- stream.close();
- } catch (Exception e) {
- stream = null;
- return "You failed to upload " + i + " => "
- + e.getMessage();
- }
- } else {
- return "You failed to upload " + i
- + " because the file was empty.";
- }
- }
- return "upload successful";
- }
这样就可以实现对多个文件的接收了功能了。SpringBoot还可以对接收文件的格式还有个数等等进行限制,我这里就不多说了,大家有兴趣的可以自己去了解了解。
千万要记住SpringBoot对multipart/form-data类型的文件接收和其它是不一样的,大家以后遇到的时候要千万小心,不要像我一样一往无前的踩进去还傻傻的以为是前端的错误。