Java SpringMVC中带文件上传和表单数据的RESTful PUT

Java SpringMVC中带文件上传和表单数据的RESTful PUT,java,rest,spring-mvc,put,Java,Rest,Spring Mvc,Put,我正在使用SpringMVC公开一些RESTfulWeb服务。其中一个操作在提交表单时调用RESTful PUT操作 但是,表单不是普通表单,因为它包含文件输入以及常规输入,如文本和复选框 通过在web.xml中添加hiddenhttmpmethodfilter,我已经将Spring配置为使用restfulput和DELETE。在我的表单中,还发送了一个隐藏的\u方法参数 所有这些都适用于删除、放置而不上载文件等。当我尝试对文件上载和表单数据进行放置时,它会给我一个405 HTTP Status

我正在使用SpringMVC公开一些RESTfulWeb服务。其中一个操作在提交表单时调用RESTful PUT操作

但是,表单不是普通表单,因为它包含文件输入以及常规输入,如文本和复选框

通过在
web.xml
中添加
hiddenhttmpmethodfilter
,我已经将Spring配置为使用restfulput和DELETE。在我的表单中,还发送了一个隐藏的
\u方法
参数

所有这些都适用于删除、放置而不上载文件等。当我尝试对文件上载和表单数据进行放置时,它会给我一个
405

HTTP Status 405 - Request method 'POST' not supported
我的控制器方法如下所示:

<form action="<c:url value='/admin/cars/${car.id}'/>" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="_method" value="PUT" />
    <input type="text" name="carName" value="${car.name}" />
    <input type="file" name="photo" />
    <input type="submit" />
</form>
@RequestMapping(value=“/admin/cars/{carId}”,method=PUT,headers=“content type=multipart/formdata”)
公共字符串updateCar(@PathVariable(“carId”)字符串carId,CarForm){
//保存并返回正确的视图。
}
我的HTML表单如下所示:

<form action="<c:url value='/admin/cars/${car.id}'/>" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="_method" value="PUT" />
    <input type="text" name="carName" value="${car.name}" />
    <input type="file" name="photo" />
    <input type="submit" />
</form>


我试图通过PUT实现的目标是可行的吗?如果是这样,如何让Spring MVC理解这一点?

实际上,
PUT
接收一个二进制流,而不是多部分数据。您可以使用
org.springframework.web.filter.HiddenHttpMethodFilter
使其工作。

在web.xml中的
HiddenHttpMethodFilter
之前添加以启用文件上载(如
HiddenHttpMethodFilter
API文档中所述)

此外:

注意:此筛选器是使用
DispatcherServlet
的替代方法
MultipartResolver
支持,例如对于具有 不使用Spring的web MVC、或用于自定义的自定义web视图 在Spring MVC
DispatcherServlet
之前应用的过滤器(例如。
隐藏HttpMethodFilter
。在任何情况下,都不应使用此过滤器 结合特定于servlet的多部分解析

(来自MF的文件,强调我的)


另外,
MultipartResolver
的bean名称必须是
filterMultipartResolver
,才能正确运行MultipartFilter
(或者必须通过
设置)

编辑:

正如我在上一篇评论中所预期的,默认情况下只支持POST方法的
CommonsMultipartResolver
存在一个问题。(实际上,isMultipartContent中的方法是POST,即使它是PUT,因为在HiddenHttpMethodFilter..之前声明了MultipartFilter。)下面的方法是extedEnded类,修改了slighlty:


如果有人对另一种解决方案(带有PUT方法的MultipartResolver)感兴趣,例如强制使用Restful样式,您可以看看。

我已经在使用它了,正如我在第三段中所说的。如果表单bean使用
commonmultipartfile
来接收文件输入,它会不起作用吗?我刚刚尝试了
MultipartFilter
,但没有什么乐趣。我认为如果使用
hiddenhttmpmethodfilter
,必须使用
MultipartFilter
,并且应该可以工作。你有登记吗<代码>10000000是已声明。如果是常规的
POST
场景,则文件上载可以工作。只有当我打算使用
PUT
时,事情才会出错。
MultipartResolver
的bean名称必须是
filterMultipartResolver
,以便
MultipartFilter
正常运行(或者必须通过
设置)。您是否在
中为这两个筛选器使用了
DispatcherServlet
的名称?MF在HHMF之前是第一位的吗?(这对我很有用。)另外,你能打开SpringMVC的调试并在这里发布输出吗?我非常感谢你,它成功了。但解决方案只是将bean命名为
filterMultipartResolver
isMultipartContent
中的
方法
POST
的形式出现,即使它是
PUT
,因为
MultipartFilter
是在
hiddenhtttpmethodfilter
之前声明的。如果我们不遵循此顺序,可能需要
PutAware…
。另外,如果(!method.equals(“post”)和(&!method.equals(“put”))不应该是