SpringMVC响应PUT请求并完成文件上传MultipartFile

背景:

1.默认情况下,SpringMVC只能响应前端发来的GET以及POST请求。
2.默认情况下,SpringMVC配合MultipartFile接受文件上传只能通过POST的方式发送。

解决问题:1:SpringMVC响应前端PUT、DELETE请求

配置web.xml:

  
  <filter>
    <filter-name>hiddenHttpMethodFilterfilter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
  filter>
  <filter-mapping>
    <filter-name>hiddenHttpMethodFilterfilter-name>
    <url-pattern>/*url-pattern>
  filter-mapping>
  
  <filter>
    <filter-name>httpPutFormContentFilterfilter-name>
    <filter-class>org.springframework.web.filter.HttpPutFormContentFilterfilter-class>
  filter>
  <filter-mapping>
    <filter-name>httpPutFormContentFilterfilter-name>
    <url-pattern>/*url-pattern>
  filter-mapping>

说明:

  1. 若只配置filter1:hiddenHttpMethodFilter 则ajax请求写法为:
$.ajax({
     
    url: "http://localhost:8080/test",
    data: data+"&_method=PUT",//发送DELETE请求即将PUT修改为DELETE即可
    type: "POST",
    dataType: "json",
    success: function (result) {
     
        console.log(result);
    }
})
  1. 同时配置filter1:hiddenHttpMethodFilter 和filter2:httpPutFormContentFilter 则ajax可写:
$.ajax({
     
    url: "http://localhost:8080/test",
    data: data,
    type: "PUT",//发送DELETE请求即将PUT修改为DELETE即可
    dataType: "json",
    success: function (result) {
     
        console.log(result);
    }
})

解决问题2:SpringMVC响应前端PUT请求并接收文件数据

默认情况直接通过put请求向服务器发送文件数据,会在浏览器端收到500错误:
SpringMVC响应PUT请求并完成文件上传MultipartFile_第1张图片
这样的问题直接去百度,得到的答案大部分都是提醒CommonsMultipartResolver的bean配置id应该是固定的写法:

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10000000"/>
    bean>

确实,这里配置如果出错,浏览器端得到的错误和上面所得500一样。但这不是解决PUT请求问题的答案。配置了这个,只能说问题解决了一半。

要解决PUT请求发送文件数据的问题,我们要看看内脏

  1. 进入到CommonsMultipartResolver类可看到该类中有一个isMultipart()方法,顾名思义其作用为判断当前请求是否是一个文件请求:

SpringMVC响应PUT请求并完成文件上传MultipartFile_第2张图片
一看好像没什么问题。继续进入到ServletFileUpload.isMultipartContent()中:
SpringMVC响应PUT请求并完成文件上传MultipartFile_第3张图片
小朋友???过滤了POST请求,意思是除了POST请求,其它方式的请求都不配携带文件数据咯。

问题发现,现在就是解决问题了,既然原因是由于CommonsMultipartResolver类中的isMultipart()导致的,那我们直接重写该方法就是了。

  1. 继承CommonsMultipartResolver类并重写方法isMultipart()
package com.nys.override;

import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import javax.servlet.http.HttpServletRequest;

/**
 * 重写CommonsMultipartResolver中的isMultipart实现PUT请求上传文件
 * @author nysheng
 */
public class MyCommonsMultipartResolver extends CommonsMultipartResolver {
     
    private static final String POST_METHOD = "POST";
    private static final String PUT_METHOD = "PUT";
    @Override
    public boolean isMultipart(HttpServletRequest request) {
     
        return !(POST_METHOD.equalsIgnoreCase(request.getMethod())||PUT_METHOD.equalsIgnoreCase(request.getMethod()))
                ?false
                :FileUploadBase.isMultipartContent(new ServletRequestContext(request));
    }
}
  1. 修改bean配置:
<bean id="multipartResolver" class="com.nys.override.MyCommonsMultipartResolver">
        <property name="maxUploadSize" value="10000000"/>
    bean>

测试结果:
	@PutMapping("/test")
    public ResultVO put(@RequestParam("logo") MultipartFile logo, HttpServletRequest request){
     
        // 获取原文件名
        System.out.println(logo);
        return ResultVO.success();
    }

SpringMVC响应PUT请求并完成文件上传MultipartFile_第4张图片

你可能感兴趣的:(SSM,编程技术,ajax,web,springmvc,MultipartFile)