我已经使用Spring(基于java注释的配置)构建了一个RESTful服务,我可以通过Curl成功执行该服务。我也试图通过HTML表单提交文件,但这不起作用。
@RequestMapping(path = "/upload", method = RequestMethod.POST)
public String handleFileUpload(@RequestPart(value = "file") MultipartFile file,
RedirectAttributes redirectAttributes) {
logger.info("POST '/upload'");
storageService.store(file);
redirectAttributes.addFlashAttribute("message",
"You successfully uploaded " + file.getOriginalFilename() + "!");
return "redirect:/";
}
我通过Curl提交文件如下:
curl -i -H "Content-Type: multipart/*; boundary=------------BOUNDARY--" -X POST --noproxy localhost, localhost:8080/upload -F "file=@test.txt"
即使我的表单提交有类型文件的输入,名称文件,我通过HTML表单得到此错误
org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'file' is not present
从我正在调查的内容来看,当文件通过HTML表单提交时,控制器似乎会期望一个模型属性,那么解决这个问题的好方法是什么呢?包含模型属性的控制器参数,可以检查空值(区分html表单或其他提交方法),还是HTML表单和RESTful服务之间的某种代理控制器会更好?
答案 0 :(得分:0)
服务看起来不错。它在CURL和HTML表单提交时都适用于我。
这是我的表格。请尝试使用它。
<html>
<head>
<title>Post Tool</title>
</head>
<body>
<h1>Sample Requests</h1>
<h2>Upload Document</h2>
<form action="http://localhost:8080/upload" method="post" enctype="multipart/form-data">
Choose a file : <input type="file" name="file" multiple/>
<input type="submit" value="Upload" />
</form>
</body>
</html>
答案 1 :(得分:0)
经过更多的研究后,我知道公共汽车多部件解析器与新版弹簧靴的搭配并不好。它很难从表单中获取POST参数。 一种解决方案是使用MultipartResolver接口的StandardServletMultipartResolver实现!