4

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.

2 Answers 2

4

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) .... 
Sign up to request clarification or add additional context in comments.

3 Comments

thank you for response clav, but my client can be whether mobile-application and web-application. Is this solution efficient enough to suite both platforms ?. Because, somehow, the body variable need to map with JSON or XML content too (@RequestBody Map<String, Object> body). PS. thinking about posting some picture with description in facebook's post
I'm not sure I understand. If you're just posting form data and the body parameter is just a string you can put whatever you want in it (json, xml, whatever). The type of client shouldn't matter, both mobile apps and web apps can post HTML forms so this should work fine unless I'm missing something. You just need to check the content type header or client type to figure out how to parse the data.
that is correctly what I mean !! Thank you for help. (sorry for my confused comment)
0

I had come to think about my question in different point of view and found that, may be, the client cannot upload files and send data in the @RequestBody at the same time.

So, I had started catching the request with WireShark. The result was as I expected. The data is missing. The only left in the request is files.

Reference: Posting a File and Associated Data to a RESTful WebService preferably as JSON

The solution may be to re-construct my web service server's method.

THX.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.