Java SpringMVC中带文件上传和表单数据的RESTful PUT
我正在使用SpringMVC公开一些RESTfulWeb服务。其中一个操作在提交表单时调用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
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 MVCDispatcherServlet
之前应用的过滤器(例如。
隐藏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”))不应该是?