Spring MVC 实现文件上传

前提

要在SpringMVC中实现文件上传,需要:

  • form表单的enctype(表单请求正文的类型,默认是application/x-www-form-urlencoded)取值必须是:multipart/form-data
  • method 属性取值必须是 Post
  • 提供一个文件选择域<input type=”file” />

文件上传原理

当form表单的enctype取值非multipart/form-data时,请求正文内容有多部分组成,每一部分都是MIME类型描述的正文,后台就不能通过request.getParameter()的方式获取请求数据,而是需要编写专门的代码去解析MIME类型描述的正文。 Apache提供的Commons-fileupload组件就可以完成这种解析工作。

实现

upload.jsp

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

controller的实现方式有三种
先配置文件解析器:

<!--配置文件解析器对象-->
<!--文件上传的解析器 id 是固定的,不能起别的名称,否则无法实现请求参数的绑定。-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<!-- 设置上传文件的最大为5MB -->
    <property name="maxUploadSize" value="10485760" />
</bean>

一般如果使用了静态资源如js,css,还要配置前端控制器,哪些静态资源不拦截:

<!--前端控制器,哪些静态资源不拦截-->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>

导入jar包:

<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>

方式一:

@RequestMapping("/fileupload1")
public String fileuoload1(HttpServletRequest request) throws Exception {
    // 使用fileupload组件完成文件上传
    // 上传的位置
    String path = request.getSession().getServletContext().getRealPath("/uploads/");
    // 判断,该路径是否存在
    File file = new File(path);
    if(!file.exists()){
        // 创建该文件夹
        file.mkdirs();
    }

    // 解析request对象,获取上传文件项
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    // 解析request
    List<FileItem> items = upload.parseRequest(request);
    // 遍历
    for(FileItem item:items){
        // 进行判断,当前item对象是否是上传文件项
        if(item.isFormField()){
            // 说明普通表单向
        }else{
            // 说明上传文件项
            // 获取上传文件的名称
            String filename = item.getName();
            // 把文件的名称设置唯一值,uuid
            String uuid = UUID.randomUUID().toString().replace("-", "");
            filename = uuid+"_"+filename;
            // 完成文件上传
            item.write(new File(path,filename));
            // 删除临时文件
            item.delete();
        }
    }

    return "success";
}

方式二:

@RequestMapping("/fileupload2")
public String fileuoload2(HttpServletRequest request, MultipartFile upload) throws Exception {
    // 使用fileupload组件完成文件上传
    // 上传的位置
    String path = request.getSession().getServletContext().getRealPath("/uploads/");
    // 判断,该路径是否存在
    File file = new File(path);
    if(!file.exists()){
        // 创建该文件夹
        file.mkdirs();
    }

    // 说明上传文件项
    // 获取上传文件的名称
    String filename = upload.getOriginalFilename();
    // 把文件的名称设置唯一值,uuid
    String uuid = UUID.randomUUID().toString().replace("-", "");
    filename = uuid+"_"+filename;
    // 完成文件上传
    upload.transferTo(new File(path,filename));

    return "success";
}

方式三:将文件上传到指定服务器(跨服务器上传)
如果图片服务器是Tomcat,需要在web.xml做配置,允许读写操作:

<servlet>
	<!--其他配置-->
	<!--接收文件的目标服务器可以支持写入操作-->
	<init-param>
		<param-name>readonly</param-name>
		<param-value>false</param-value>
	</init-param>
</servlet>

导入jar包:

<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-core</artifactId>
  <version>1.18.1</version>
</dependency>

<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-client</artifactId>
  <version>1.18.1</version>
</dependency>
@RequestMapping("/fileupload3")
public String fileuoload3(MultipartFile upload) throws Exception {
    // 定义上传文件服务器路径
    String path = "http://XXX";

    // 说明上传文件项
    // 获取上传文件的名称
    String filename = upload.getOriginalFilename();
    // 把文件的名称设置唯一值,uuid
    String uuid = UUID.randomUUID().toString().replace("-", "");
    filename = uuid+"_"+filename;

    // 创建客户端的对象
    Client client = Client.create();

    // 和图片服务器进行连接
    WebResource webResource = client.resource(path + filename);

    // 上传文件
    webResource.put(upload.getBytes());

    return "success";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值