Spring 3.0 FileUpload只用POST?

Ale*_*der 7 spring file-upload spring-mvc

我正在尝试使用spring 3上传一个带有一个参数的文件.

这是我的控制器方法,它应该启用此服务:

@RequestMapping(value="/{id}", method = RequestMethod.PUT, headers="content-type=multipart/form-data")
public ResponseEntity<String> uploadImageWithJsonParamater(@PathVariable("id") Long id, @RequestParam String json, @RequestParam MultipartFile customerSignFile) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

问题是,服务器无法调度到此方法:MissingServletRequestParameterException:必需的字符串参数'json'不存在

如果我将RequestMethod从PUT更改为POST,一切都很好.那么有人知道这个问题吗?

似乎不允许通过PUT传输表单数据.

我调试了一下,以下方法在PUT情况下返回false,但在POST情况下为true:

public boolean isMultipart(HttpServletRequest request) {
    return (request != null && ServletFileUpload.isMultipartContent(request));
}
Run Code Online (Sandbox Code Playgroud)

我将不胜感激任何帮助!

提前致谢!

小智 5

我遇到了同样的问题。我的解决方案是实现一个ExtendedMultipartResolver也接受通过 http 方法 PUT 发送的多部分的方法。只需复制CommonsMultipartResolver代码,重命名该类并根据isMultipart()您的需要更改函数的实现:

private boolean isMultipartContent(HttpServletRequest request) {
  String httpMethod = request.getMethod().toLowerCase();
  // test for allowed methods here...
  String contentType = request.getContentType();
  return (contentType != null && contentType.toLowerCase().startsWith("multipart"));
}


public boolean isMultipart(HttpServletRequest request) {
      return (request != null && isMultipartContent(request));
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处检查 POST、PUT 或其他 HTTP 方法。就我而言,所有方法都将被接受,因为我的控制器注释将过滤到允许的方法。

不要忘记在 spring web 上下文中配置 bean:

<bean id="multipartResolver" class="sample.package.ExtendedMultipartResolver"/>
Run Code Online (Sandbox Code Playgroud)

希望有帮助。

干杯克里斯


Jas*_*nan 5

您可以使用spring的HiddenHttpMethodFilter来完成此操作,但是您需要确保在Web.xml过滤器链中的HiddenHttpMethodFilter之前放置Spring MultipartFilter.

例如:在您的web.xml中

<filter>
    <filter-name>MultipartFilter</filter-name>
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
    <init-param>
        <param-name>multipartResolverBeanName</param-name>
        <param-value>filterMultipartResolver</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>MultipartFilter</filter-name>
    <servlet-name>/*</servlet-name>
</filter-mapping>
<filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <servlet-name>/*</servlet-name>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)

然后在spring-config.xml中添加对CommonsMultipartResolver的引用:

<bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
Run Code Online (Sandbox Code Playgroud)

请注意,如果您不添加spring-config.xml条目,则MultipartFilter将默认使用使用servlet规范3.0实现的MultipartResolver,并且如果您不使用3.0 ,则会抛出错误:NoSuchMethodError HttpServletRequest.getParts().


Shi*_*gon 2

您无法按照 HTML 标准通过 PUT 发送表单数据。您只能通过 PUT 发送文件,在这种情况下,它们的发送效率比使用 POST 更有效(因为您不再有所有的多部分开销),但为了让您 PUT 侦听服务器端组件实际接收文件通过 PUT,你必须确保你确实向它发送了一个 PUT 命令(例如通过 javascript)。下面是一个使用 JQuery 的示例:

$('#file_upload').fileUpload({
    namespace: 'file_upload',
    url: '/path',
    method: 'PUT'
});
Run Code Online (Sandbox Code Playgroud)