【SpringMVC学习06】SpringMVC文件上传与下载

  文件的上传和下载是项目开发中最常用的功能,例如图片的上传与下载、 邮件附件的上传与下载等。 接下来,将对 Spring MVC 环境中文件的上传和下载进行讲解。

一、文件上传概述

  多数文件上传都是通过表单形式提交给后台服务器的,因此,要实现文件上传功能,就需要 提供一个文件上传的表单,而该表单必须满足以下 3 个条件。

  • form 表单的 method 属性设置为 post。
  • form 表单的 enctype 属性设置为 multipart/form-data。
  • .提供<input type="file" name="filename" />的文件上传输入框。

  当客户端 form 表单的 enctype 属性为 multipart/form-data 时,浏览器就会采用二进制流的 方式来处理表单数据,服务器端就会对文件上传的请求进行解析处理。 Spring MVC 为文件上传 提供了直接的支持,这种支持是通过 MultipartResolver (多部件解析器)对象实现的 。 MultipartResolver 是一个接口对象,需要通过它的实现类 CommonsMultipartResolver 来完成文 件上传工作。 在 Spring MVC 中使用 MultipartResolver 对象非常简单,只需要在配置文件中定义 MultipartResolver 接口的 Bean 即可,其具体配置方式如下。

<!-- 配置文件解析器对象,要求id名称必须是multipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760000"/>
    </bean>

在上述配置代码中,除配置了 CommonsMultipartResolver 类外,还通过元素配 置了编码格式以及允许上传文件的大小。

此外,在Maven环境中需要导入两个依赖:

<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>

二、文件上传实例

前端html写法:

<h3>SpringMVC文件上传</h3>
    <form action="/file/fileUpload2" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload" /><br/>
        <input type="submit" value="上传"/>
    </form>

后端代码写法:

    /**
     * SpringMVC文件上传
     * @param request
     * @param upload
     * @return
     * @throws Exception
     */
    @RequestMapping("/fileUpload2")
    public String fileUpload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("文件上传。。。");

        //使用fileUpload组件完成文件上传
        
            //上传文件项
            String originalFilename = upload.getOriginalFilename();
            //上传的位置
            String path = request.getSession().getServletContext().getRealPath("/uploads/");
            //判断,该路径是否存在
            File file = new File(path);
            if (!file.exists()) {
                file.mkdir();
            }
            System.out.println(path);
            //把文件的名称设置唯一值,uuid
            String uuid = UUID.randomUUID().toString().replace("-", "");
            originalFilename = uuid + "_" + originalFilename;
            //完成文件上传
            System.out.println(path + originalFilename);
            upload.transferTo(new File(path,originalFilename));
            request.getSession().setAttribute("images","uploads/"+originalFilename);
            request.getSession().setAttribute("fileName",originalFilename);

        return "success";
}

三、实现文件下载

文件下载就是将文件服务器中的文件下载到本机上。 在 Spring MVC 环境中,实现文件下载 大致可分为如下两个步骤。
(1)在客户端页面使用一个文件下载的超链接,该链接的 href 属性要指定后台文件下载的方 法以及文件名(需要先在文件下载目录中添加了一个名称为 “1 .jpg” 的文件),具体代码示例如下。

<a href="${pageContext.request.contextPath}/download?filename=1.jpg"> 
文件下载 
</a> 

(2)在后台 Controller 类中,使用 Spring MVC 提供的文件下载方法进行文件下载。 Spring MVC 提供了一个 ResponseEntity 类型的对象,使用它可以很方便地定义返回的 HttpHeaders 对象和 HttpStatus 对象,通过对这两个对象的设置,即可完成下载文件时所需的配置信息。 文件下载的示例代码如下所示。

 @RequestMapping("/download") 
 public ResponseEntity<byte[]> fileDownload(HttpServletRequest request, String filename) throws Exception{ 
 	//指定要下载的文件所在路径 
 	String path = request.getServletContext() .getRealPath("/upload/"); 
 	//创建该文件对象 
 	File file = new File(path+File.separator+filename); 
 	//设置响应头 
 	HttpHeaders headers = new HttpHeaders(); 
 	//通知浏览器以下载的方式打开文件
 	headers.setContentDispositionFormData("attachment", filename); 
	 // 定义以流的形式下载返回文件数据 
 	headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 
 	//使用 Sring MVC 框架的 ResponseEntity 对象封装返回下载数据 
	 return new ResponseEntity<byte[]> (FileUtils.readFileToByteArray(file), headers,HttpStatus.OK); 
 }

  在 fileDownloadO方法中,首先根据文件路径和需要下载的文件名来创建文件对象,然后对 响应头中文件下载时的打开方式以及下载方式进行了设置,最后返回 ResponseEntity 封装的下 载结果对象。
  ResponseEntity 对象有些类似前面章节介绍的@ResponseBody 注解,它用于直接返回结果 对象。 上面示例中,设置响应头信息中的 MediaType 代表的是 Interner Media Type (即互联网 媒体类型),也叫作 MIME 类型, MediaType.APPLlCATION_OCTET _STREAM 的值为 application/ octet -stream ,即表示以二进制流的形式下载数据; HttpStatus 类型代表的是 Http 协议中的状态,示例中的 HttpStatus.OK 表示 200 ,即服务器已成功处理了请求。

猜你喜欢

转载自blog.csdn.net/weixin_43800761/article/details/102808885