我正在开发一个基于Spring 3.2.4的小型RESTful服务,并在this article之后编写一个自定义函数来发送Multipart请求。
首先,在控制器中,我编写了样本函数来测试
@RequestMapping(value = "/createUser", method = RequestMethod.POST)
public @ResponseBody String createUser(@RequestBody User user)
{
if (user != null) {
log.debug("Username: " + user.getUsername());
}
return "Successfully created!";
}
User对象包含使用 Jackson JSON 来获取和解析数据的用户信息。我还使用cURL发送请求和我测试的命令
curl http://localhost:8080/user/createUser --data-binary @test.txt -X POST -i -H "Content-Type: application/json"
这是 text.txt
{
"id" : "123456",
"username" : "YOUR_USERNAME",
"password" : "YOUR_PASSWORD",
"email" : "YOUR_EMAIL"
}
应用程序返回"已成功创建!"并记录用户名。它运作良好。
其次,我认为一切都很简单,但我错了。当我编写以下函数以使用User和MultipartFile对象发送Multipart请求时。
@RequestMapping(
value = "/createUser",
method = RequestMethod.POST,
consumes = {"multipart/mixed", "multipart/form-data"})
public @ResponseBody String createUser(
@RequestPart("user") @Valid User user,
@RequestPart("file") MultipartFile file) {
if (user != null) {
log.debug("Username: " + user.getUsername()); // The username is null
}
return "Successfully created!";
}
我继续使用cURL来测试命令
curl http://localhost:8080/user/createUser --data-binary @test.txt -X POST -i -H "Content-Type: multipart/mixed; boundary=4ebf00fbcf09"
text.txt 文件已更改
--4ebf00fbcf09
Content-Disposition: form-data; name="user"
Content-Type: application/json; charset=UTF-8
Content-Transfer-Encoding: 8bit
{
"id" : "123456",
"username" : "YOUR_USERNAME",
"password" : "YOUR_PASSWORD",
"email" : "YOUR_EMAIL"
}
--4ebf00fbcf09
Content-Disposition: form-data; name="file"; filename="no_thumb.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
<... File Data ...>
--4ebf00fbcf09--
我遇到的问题是@RequestPart总是 NULL 。详细说明:
我该如何解决?
请帮我解决这个问题。
答案 0 :(得分:1)
答案有点晚,但仍然有用。这对于我来说,使用@RequestPart
附加有效负载和文件是有用的RevocationFlag = X509RevocationFlag.EntireChain
使用下面的curl命令我也可以验证这个
@RequestMapping(method = RequestMethod.POST)
public @ResponseBody String create(@RequestPart Blah blah,
@RequestPart(value = "uploadfile", required=false) MultipartFile) {...}
确保转义有效内容,somevalid.zip(第二个-F是可选的,因为required设置为false)应该在执行curl的同一目录中,或者用文件的有效路径替换它。 / p>