从表单帖子

时间:2016-11-21 10:56:02

标签: rest spring-mvc file-upload spring-boot

我已经使用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服务之间的某种代理控制器会更好?

2 个答案:

答案 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实现!