十、文件上传和下载
1、文件下载
使用ResponseEntity实现文件下载的功能
1)在controller包下新建FileUpAndDownController类,并设置
//实现下载功能 @RequestMapping("/testDown") //该方法返回值为ResponseEntity<byte[]> public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException { //获取ServlContext对象 ServletContext servletContext = session.getServletContext(); //获取服务器中文件的真实路径 String realPath = servletContext.getRealPath("/static/img/1.jpg"); System.out.println("真实路径:"+realPath); //创建输入流。下载文件需要先读取文件,然后再写入文件,完成一个复制过程,因此需要创建输入流 InputStream is = new FileInputStream(realPath); //创建字节数组。is.available()用来获取输入流is对应文件的所有字节数 byte[] bytes = new byte[is.available()]; //将输入流is对应文件的所有字节都读到字节数组bytes中 is.read(bytes); //创建HttpHeaders对象设置响应头信息 MultiValueMap<String, String> headers = new HttpHeaders(); //设置要下载方式以及下载文件的名字 //headers.add("")中只有1.jpg可以更改,其它的都不能改,因为其它部分是用来设置下载方式的 headers.add("Content-Disposition", "attachment;filename=1.jpg"); //设置相应状态码。OK的状态码为200 HttpStatus statusCode = HttpStatus.OK; //创建ResponseEntity对象,用来响应浏览器 //bytes为响应体;headers为响应头,是Map集合;statusCode为响应状态码 ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(bytes, headers, statusCode); //关闭输入流 is.close(); return responseEntity; }
2)在static目录下新建img目录,并放入图片1.jpg
3)在templates目录下新建file.html文件,并设置
<!--下载文件--> <a th:href="@{/testDown}">下载1.jpg</a><br>
4)在resources根目录的springMVC.xml主配置文件中,编写主页面的标签
<mvc:view-controller path="/file" view-name="file" />
2、文件上传
1)添加fileupload依赖
SpringMVC中上传文件必须要有此依赖,但是下载不需要。
<!--fileupload依赖--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
2)在resources根目录的springMVC.xml主配置文件中添加配置(配置文件上传解析器)
<!--配置文件上传解析器,将上传的文件封装为MultipartFile对象。 此处的id必须为multipartResolver,否则上传会报错。 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
3)file.html中的设置
<!--上传文件,上传必须使用post--> <form th:action="@{/testUp}" method="post" enctype="multipart/form-data"> 头像:<input type="file" name="photo"><br> <input type="submit" value="上传"><br> </form>
4)FileUpAndDownController类中的设置
//实现上传功能 @RequestMapping("/testUp") /** * MultipartFile photo表示为将上传的photo文件封装到MultipartFile对象中 * * 由于无法之间将photo封装为MultipartFile对象,因此还需要在springMVC.xml * 中配置文件上传解析器 * * HttpSession session用来获取服务器路径 */ public String testUp(MultipartFile photo, HttpSession session) throws IOException { //获取上传文件的文件名 String fileName = photo.getOriginalFilename(); //获取上传文件的后缀名 String suffixName = fileName.substring(fileName.lastIndexOf(".")); //将UUID作为文件名 String uuid = UUID.randomUUID().toString(); //将uuid和后缀名拼接后的结果作为最终的文件名 fileName = uuid + suffixName; //获取ServlContext对象,然后通过servletContext获取服务器中photo目录的路径 ServletContext servletContext = session.getServletContext(); //获取服务器中photo目录的真实路径 String photoPath = servletContext.getRealPath("photo"); File file = new File(photoPath); //判断photoPath所对应路径是否存在 if (!file.exists()){ //若不存在,则创建目录 file.mkdir(); } //File.separator表示文件分隔符 //将“photo目录路径+文件分隔符+上传文件的名称”组合为最终的上传路径 String finalPath = photoPath + File.separator + fileName; //文件上传 photo.transferTo(new File(finalPath)); return "success"; }