使用@RequestParam MultipartFile时,Spring MVC @RequestBody给了我一个空字符串 [英] Spring MVC @RequestBody give me an empty String when use with @RequestParam MultipartFile

查看:2869
本文介绍了使用@RequestParam MultipartFile时,Spring MVC @RequestBody给了我一个空字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个web服务代码存在问题

  @Controller 
@RequestMapping(/ u_tutorial)
public class UploadTutorial
{
@RequestMapping(value =tutorial1,method = RequestMethod.POST,headers =Accept = application / json)
@ResponseStatus(value = HttpStatus.OK)
public void upload(@RequestBody String body,@RequestParam List< MultipartFile> file,Principal principal,
HttpServletRequest request)
{
System.out.println( body:+ body); //(MultipartFile mf:file)

总是清空
{
System.out.println(file:+ mf.getOriginalFilename());



code
$ b

情况是我想要上传带有一些数据在请求正文的文件,我的身体变量总是给我一个空的字符串。

但是当我尝试只使用@RequestBody String body或@RequestParam列表文件,它像一个魅力。

我已经做了一些搜索,发现这是因为InputStream的问题。一些建议的解决方案已经讨论过,但并不完全相关我的问题(或可能是的,但我不明白)。

任何人都可以给我一个解决方案吗? Thx。



PS 1.这是我的图书馆版本

 < ;性状> 
< project.build.sourceEncoding> UTF-8< /project.build.sourceEncoding>
< spring.core.version> 3.1.4.RELEASE< /spring.core.version>
< spring.security.version> 3.1.3.RELEASE< /spring.security.version>
< spring.data.mongodb.version> 1.1.0.RELEASE< /spring.data.mongodb.version>
< cglib.version> 2.2< /cglib.version>
< aspectj.version> 1.6.10< /aspectj.version>
< mongodb.driver.version> 2.10.1< /mongodb.driver.version>
<! - 记录 - >
< slf4j.version> 1.6.1< /slf4j.version>
< log4j.version> 1.2.14< /log4j.version>
< javax.jstl-taglibs.version> 1.1.2< /javax.jstl-taglibs.version>
< jackson.version> 1.9.3< /jackson.version>
<! - Testing - >
< mockito.version> 1.8.5< /mockito.version>
< junit.version> 4.8.2< /junit.version>
<! - 插件 - >
0.2.3 < maven.compiler.plugin.version> 2.3.2< /maven.compiler.plugin.version>
< maven.apt.plugin.version> 1.0< /maven.apt.plugin.version>
<! - Utilities - >
< apache.common.io.version> 2.4< /apache.common.io.version>
< apache.common.fileupload.version> 1.2.2< /apache.common.fileupload.version>
< jodatime.version> 2.1< /jodatime.version>
< / properties>

PS 2.对不起我的英文。您可以使body字符串成为表单上的隐藏字段,并将其作为另一个@RequestParam发布,而不是将其作为单独的@RequestBody参数使用。所以你的表单看起来就像这样:

 < form id =myFormmethod =postenctype =multipart /格式数据> 
< input type =hiddenname =bodyvalue =bodyValue/>
< input type =filename =file/>
...

控制器看起来像这样:

  public void upload(@RequestParam String body,@RequestParam List< MultipartFile>文件,Principal principal,HttpServletRequest请求)
....


I have a problem with this web service code

@Controller
@RequestMapping("/u_tutorial")
public class UploadTutorial
{
    @RequestMapping(value = "tutorial1", method = RequestMethod.POST, headers = "Accept=application/json")
    @ResponseStatus(value = HttpStatus.OK)
    public void upload(@RequestBody String body, @RequestParam List<MultipartFile> file, Principal principal,
        HttpServletRequest request)
    {
        System.out.println("body: " + body); // always empty

        for (MultipartFile mf : file)
        {
            System.out.println("file: " + mf.getOriginalFilename());
        }
    }
}

The situation is when I want to upload files with some data in the request body, my body variable always gives me an empty String.

But when I try to use only "@RequestBody String body" or "@RequestParam List file", It works like a charm.

I had done some searching and found that it is because the InputStream problem. Some suggested solution have already discussed but not quite related to my problem (or may be yes but i don't understand).

Can anyone give me a solution ? Thx.

PS 1. here is my library version

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.core.version>3.1.4.RELEASE</spring.core.version>
    <spring.security.version>3.1.3.RELEASE</spring.security.version>
    <spring.data.mongodb.version>1.1.0.RELEASE</spring.data.mongodb.version>
    <cglib.version>2.2</cglib.version>
    <aspectj.version>1.6.10</aspectj.version>
    <mongodb.driver.version>2.10.1</mongodb.driver.version>
    <!-- Logging -->
    <slf4j.version>1.6.1</slf4j.version>
    <log4j.version>1.2.14</log4j.version>
    <javax.jstl-taglibs.version>1.1.2</javax.jstl-taglibs.version>
    <jackson.version>1.9.3</jackson.version>
    <!-- Testing -->
    <mockito.version>1.8.5</mockito.version>
    <junit.version>4.8.2</junit.version>
    <!-- Plugins -->
    <maven.copy.plugin.version>0.2.3</maven.copy.plugin.version>
    <maven.compiler.plugin.version>2.3.2</maven.compiler.plugin.version>
    <maven.apt.plugin.version>1.0</maven.apt.plugin.version>
    <!-- Utilities -->
    <apache.common.io.version>2.4</apache.common.io.version>
    <apache.common.fileupload.version>1.2.2</apache.common.fileupload.version>
    <jodatime.version>2.1</jodatime.version>
</properties>

PS 2. sorry for my english.

解决方案

You can make the "body" string a hidden field on the form and post it as another @RequestParam rather than having it as a separate @RequestBody parameter. So your form would look something like this:

<form id="myForm" method="post" enctype="multipart/form-data">
    <input type="hidden" name="body" value="bodyValue"/>
    <input type="file" name="file"/>
    ...

The controller would look like this:

public void upload(@RequestParam String body, @RequestParam List<MultipartFile> file, Principal principal, HttpServletRequest request)
....

这篇关于使用@RequestParam MultipartFile时,Spring MVC @RequestBody给了我一个空字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆