SpringMVC实战-多文件上传

来源:互联网 发布:网络电视点播要钱吗 编辑:程序博客网 时间:2024/06/07 06:58

Spring MVC支持文件上传,它使用的是类CommonsMulitpartResolver。

1、配置MultipartResolver

想要使用Spring的文件上传功能,首先要在上下文中配置MultipartResolver。

    <bean id="multipartResolver"         class="org.springframework.web.multipart.commons.CommonsMultipartResolver"        p:defaultEncoding="UTF-8"        p:maxUploadSize="5242880"        p:uploadTempDir="fileUpload/temp"/>
  • defaultEncoding是请求的编码格式;
  • maxUploadSize是上传文件的大小限制,单位是字节;
  • uploadTempDir是上传文件的临时路径,上传完成后临时目录中的临时文件会被自动删除。
    为了能使CommonsMulitpartResolver正确工作,还必须在pom.xml文件中添加两个依赖:
    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->    <dependency>        <groupId>commons-io</groupId>        <artifactId>commons-io</artifactId>        <version>2.4</version>    </dependency>    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->    <dependency>        <groupId>commons-fileupload</groupId>        <artifactId>commons-fileupload</artifactId>        <version>1.3.1</version>    </dependency>

2、编写controller和页面

此处采用的方法是在浏览器中访问URL:”/fileUploadPage”,返回视图fileupload.jsp,然后这个页面中是一个表单,将文件提交到URL:”/upload”中。

    @RequestMapping(value="/fileUploadPage")    public String fileUploadPage(){        return "user/fileUpload";    }    @RequestMapping(value="/upload")    public String fileUpload(@RequestParam("name")String name,                            @RequestParam("file")MultipartFile file)throws Exception{        if(!file.isEmpty()){            file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));//将上传的文件保存到磁盘中            return "redirect:success.html";        }else{            return "redirect:fail.html";        }    }

Spring MVC会将上传的文件绑定到MultipartFile对象中,MultipartFile提供了操作文件的方法。具体方法有:
1. byte[] getBytes() : 获取文件内容。
2. String getContentType() : 获取文件MIME类型,如image/jpeg、text/plain等。
3. InputStream getInputStream():获取文件流。
4. String getName() : 获取表单中文件组件的名字。
5. String getOriginalFileName() : 获取上传文件的原名。
6. long getSize() : 获取文件的大小,单位是byte。
7. boolean isEmpty() : 判断是否有上传的文件.
8. void transferTo(File dest) : 将该文件保存到一个目标文件中,也就是说在此之前它是在内存中的。
负责上传文件的表单的编码类型必须是”multipart/form-data”。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">    <title>上传图片</title>    <meta http-equiv="pragma" content="no-cache">    <meta http-equiv="cache-control" content="no-cache">    <meta http-equiv="expires" content="0">        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">    <meta http-equiv="description" content="This is my page">    <!--    <link rel="stylesheet" type="text/css" href="styles.css">    -->  </head>  <body>    <h1>请选择上传的图片:</h1>    <form method="post" action="<c:url value='/upload'/>" enctype="multipart/form-data">        <input type="text" name="name"/>        <input type="file" name="file"/>        <input type="submit"/>    </form>  </body></html>

如何上传多个文件

controller这边只需要把file改成file数组就可以了,上传单个文件时也可以用数组的。

@RequestMapping(value="/upload")    public String fileUpload(@RequestParam("name")String name,                            @RequestParam("file")MultipartFile[] file)throws Exception{        for(int i = 0 ; i < file.length; i++){            if(!file[i].isEmpty()){                file[i].transferTo(new File("D:/temp/" + file[i].getOriginalFilename()));            }else{                return "redirect:fail.html";            }        }        return "redirect:success.html";    }

多个文件都在数组里,依次遍历就可以了。前端页面就是在一个表单里面上传多个文件。

0 0