请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 1204|回复: 0

Spring Boot2.0连载(33)-- Spring Boot文件上传下载

[复制链接]
发表于 2018-5-21 20:41:35 | 显示全部楼层 |阅读模式
更多Spring Boot2.0的知识敬请期待疯狂软件著作《Spring Boot企业应用实战》上市

文件上传是实际项目开发当中最常用的功能。为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这种情况下,浏览器才会把用户选择文件的二进制数据发送给服务器。
一旦设置了enctype为multipart/form-data,此时浏览器将采用二进制流的方式来处理表单数据,而对文件上传的处理涉及在服务器端解析原始的HTTP响应。2003年,Apache Software Foundation发布了开业的Commons FileUpload组件,很快成为Servlet/JSP程序员上传文件的最佳选择。
Servlet 3.0规范已经提供了方法来处理文件上传,但这种上传需要在Servlet中完成。而Spring MVC则提供了更简单的封装。
Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。SpringMVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。因此,Spring MVC的文件上传还需要依赖于Apache Commons FileUpload的组件。
Spring Boot的spring-boot-starter-web已经集成了Spring MVC,所以使用Spring Boot完成文件上传下载更加简单。


示例 Spring Boot文件上传
(1)修改pom.xml文件,引入Apache Commons依赖。

<!-- Apache Commons FileUpload组件依赖,
由于不属于Spirng Boot,所以需要加上版本 -->
  1. <dependency>
  2.       <groupId>commons-fileupload</groupId>
  3.       <artifactId>commons-fileupload</artifactId>
  4.       <version>1.3.3</version>
  5.     </dependency>
复制代码



(2)负责上传文件的表单和一般表单有一些区别,表单的编码类型必须是“multipart/form-data”类型。

<form class="form-horizontal" action="upload" enctype="multipart/form-data" method="post">
    <input class="form-control" placeholder="请选择文件" type="file" name="file"/>
</form>

(3)控制器代码:
  1. import java.io.File;
  2. import javax.servlet.http.HttpServletRequest;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.PostMapping;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestParam;
  7. import org.springframework.web.multipart.MultipartFile;

  8. @Controller
  9. public class FileUploadController {

  10.     @RequestMapping("/")
  11.     public String index(){
  12.         return "index";
  13.     }
  14.    
  15.     // 上传文件会自动绑定到MultipartFile中
  16.      @PostMapping(value="/upload")
  17.      public String upload(HttpServletRequest request,
  18.             @RequestParam("file") MultipartFile file) throws Exception{
  19.         // 如果文件不为空,写入上传路径
  20.         if(!file.isEmpty()){
  21.             // 上传文件路径
  22.             String path = request.getServletContext().getRealPath(
  23.                     "/upload/");
  24.             System.out.println("path = " + path);
  25.             // 上传文件名
  26.             String filename = file.getOriginalFilename();
  27.             File filepath = new File(path,filename);
  28.             // 判断路径是否存在,如果不存在就创建一个
  29.             if (!filepath.getParentFile().exists()) {
  30.                 filepath.getParentFile().mkdirs();
  31.             }
  32.             // 将上传文件保存到一个目标文件当中
  33.             file.transferTo(new File(path+File.separator+ filename));
  34.             return "success";
  35.         }else{
  36.             return "error";
  37.         }
  38.      }
  39. }
复制代码


Spring MVC会将上传文件绑定到MultipartFile对象中。MultipartFile提供了获取上传文件内容、文件名等方法,通过transferTo()方法还可以将文件存储到磁盘当中,MultipartFile对象的重点方法如下。
  • byte[] getBytes():获取文件数据。
  • String getContentType():获取文件MIME类型,如image/jpeg等。
  • InputStream getInputStream():获取文件流。
  • String getName():获取表单中文件组件的名字。
  • String getOriginalFilename():获取上传文件的原名。
  • long getSize():获取文件的字节大小,单位为byte。
  • boolean isEmpty():是否有上传的文件。
  • void transferTo(File dest):将上传文件保存到一个目标文件当中

读者可以自行测试。


您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

微信群请扫二维码
QQ交流1群:
545923995
(未满)

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2020-2-22 02:39 , Processed in 0.213842 second(s), 6 queries , File On.

快速回复 返回顶部 返回列表