乐于分享
好东西不私藏

软件架构技术(Java)之Spring MVC文件上传下载

软件架构技术(Java)之Spring MVC文件上传下载
一、文件上传概述

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

  • form表单的method属性设置为post;

  • form表单的enctype属性设置为multipart/form-data;

  • 提供<input type="file" name="filename" />的文件上传输入框。

案例如下:

     <formaction="uploadUrl"method="post"enctype="multipart/form-data">          <inputtype="file"name="filename"multiple="multiple" />          <inputtype="submit"value="文件上传" />     </form>

Spring MVC通过MultipartResolver实现文件上传功能。MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipartResolver来完成文件上传工作。

<beanid="multipartResolver"            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">             <!--设置请求编码格式,必须与JSP中的pageEncoding属性一致,默认为ISO-8859-1-->             <propertyname="defaultEncoding"value="UTF-8" />             <!--设置允许上传文件的最大值(2M),单位为字节-->             <propertyname="maxUploadSize"value="2097152" /></bean>

通过<property>元素可以对文件解析器类CommonsMultipartResolver的如下属性进行配置。

  • maxUploadSize:上传文件最大长度(以字节为单位);

  • maxInMemorySize:缓存中的最大尺寸;

  • defaultEncoding:默认编码格式;

  • resolveLazily:推迟文件解析,以便在Controller中捕获文件大小异常。

Spring MVC文件上传案例:

1、在pom.xml文件添加依赖

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency>

2、在Spring MVC配置文件中配置文件上传

<!--配置文件上传-->    <beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        <propertyname="defaultEncoding"value="UTF-8"/>        <propertyname="maxUploadSize"value="20971520"/>    </bean>

3、设置文件上传表单

<formaction="/uploadUserHeader"method="post"enctype="multipart/form-data">      <inputtype="file"name="filename"multiple="multiple">      <inputtype="submit"value="提交"></form>

4、实现文件上传业务逻辑

// 用户头像上传    @PostMapping("/uploadUserHeader")    public String uploadUserHeader(            @RequestParam("filename")MultipartFile filename,            Model model,            HttpServletRequest request){        // 判断文件是否为空,返回值为false表示文件不为空        if (filename.isEmpty()==false){            // 获取文件的原名            System.out.println("原名:" + filename.getOriginalFilename());            // 获取文件的大小            System.out.println("文件大小:"+ filename.getSize());            // 获取文件的类型            System.out.println("文件类型:" + filename.getContentType());            System.out.println("name:" + filename.getName());            // 保存文件到本地            // 指定文件保存目录            String path = "C:\\images";            // 判断文件目录是否存在,不存在则创建。            // 判断文件目录是否存在,不存在则创建            File file = new File(path);            if (!file.exists()){                file.mkdirs();            }            // 保存文件到物理磁盘中            String filePath = path + File.separator+ filename.getOriginalFilename();            try{                filename.transferTo(new File(filePath));                // 返回用户头像存储信息                model.addAttribute("path",path);                model.addAttribute("headerImg",filename.getOriginalFilename());//                String uid = (String) request.getSession().getAttribute("uid");//                UserInfoModel userInfoModel =                // model.addAttribute("userInfo",userInfoModel);                return "userinfo";            }catch (Exception e){                e.printStackTrace();            }        }else{            System.out.println("文件为空!");        }        return "userinfo";    }

二、文件下载概述

文件下载就是将文件服务器中的文件下载到本机上。

进行文件下载时,为了不以客户端默认的方式处理返回的文件,可以在服务器端对所下载的文件进行相关的配置。

配置的内容包括返回文件的形式、文件的打开方式、文件的下载方式和响应的状态码。

  • 文件的打开方式可以通过响应头Content-Disposition的值来设定。

  • 文件的下载方式可以通过响应头Content-Type中设置的MIME类型来设定。

在Spring MVC环境中,实现文件下载大致可分为如下两个步骤:

1、在客户端页面使用一个文件下载的超链接,该链接的href属性要指定后台文件下载的方法以及文件名。如下:

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

2、在后台使用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);    }

仅用于交流学习!

相关学习资料