请求被拒绝,因为在springboot中找不到多部分边界

时间:2016-03-15 07:56:57

标签: java web-services file-upload spring-boot multifile-uploader

我正在尝试使用带有postman chrome附加组件的spring boot和webservices。

在邮递员content-type="multipart/form-data"中,我得到以下例外情况。

HTTP Status 500 - Request processing failed; 
nested exception is org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; 
nested exception is java.io.IOException: 
org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found

在Controller中我指定了以下代码

@ResponseBody
@RequestMapping(value = "/file", headers = "Content-Type= multipart/form-data", method = RequestMethod.POST)

public String upload(@RequestParam("name") String name,
        @RequestParam(value = "file", required = true) MultipartFile file)
//@RequestParam ()CommonsMultipartFile[] fileUpload
{
    // @RequestMapping(value="/newDocument", , method = RequestMethod.POST)
    if (!file.isEmpty()) {
        try {
            byte[] fileContent = file.getBytes();
            fileSystemHandler.create(123, fileContent, name);
            return "You successfully uploaded " + name + "!";
        } catch (Exception e) {
            return "You failed to upload " + name + " => " + e.getMessage();
        }
    } else {
        return "You failed to upload " + name + " because the file was empty.";
    }
}

这里我指定文件处理程序代码

public String create(int jonId, byte[] fileContent, String name) {
    String status = "Created file...";
    try {
        String path = env.getProperty("file.uploadPath") + name;
        File newFile = new File(path);
        newFile.createNewFile();
        BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(newFile));
        stream.write(fileContent);
        stream.close();
    } catch (IOException ex) {
        status = "Failed to create file...";
        Logger.getLogger(FileSystemHandler.class.getName()).log(Level.SEVERE, null, ex);
    }
    return status;
}

9 个答案:

答案 0 :(得分:71)

问题是你自己设置Content-Type,让它为空。谷歌Chrome将为您完成。 multipart Content-Type需要知道文件边界,当你删除Content-Type时,Postman会自动为你做。

答案 1 :(得分:13)

取消选中Postman中的内容类型,邮递员会根据您在运行时输入的内容自动检测内容类型。

Sample

答案 2 :(得分:10)

这对我有用: 通过Postman将文件上传到SpringMVC后端webapp:

后端: Endpoint controller definition

邮差: Headers setup POST Body setup

答案 3 :(得分:2)

"邮递员 - REST客户端"不适合使用设置content-type进行后期操作。您可以尝试使用"高级REST客户端"或其他人。

此外,自Spring 3.1 M2以来,标题已被消耗和替换,请参阅https://spring.io/blog/2011/06/13/spring-3-1-m2-spring-mvc-enhancements。您可以直接使用produces = MediaType.MULTIPART_FORM_DATA_VALUE

答案 4 :(得分:1)

听说您可以在邮递员中完成此操作

placeholders

答案 5 :(得分:0)

我在从Postman发出POST请求时遇到了同样的问题,之后我可以通过设置一个带有边界值的自定义Content-Type来解决问题。

我认为人们会遇到类似的问题,因此,我会分享我的解决方案。

postman

答案 6 :(得分:0)

当我使用邮递员将5.6M的文件发送到外部网络时,遇到了同样的麻烦。 (在我自己的计算机和本地测试环境上成功执行了相同的操作。) 检查所有服务器配置和HTTP标头后,我发现原因是Postman可能难以对外部HTTP请求进行模拟请求。 最后,我在chrome html页面上成功执行了sendfile请求。 只是作为参考:)

答案 7 :(得分:0)

我遇到了这个问题,因为我使用了基于axios编写的request.js
而且我已经在request.js中设置了defaults.headers

import axios from 'axios'
const request = axios.create({
  baseURL: '', 
  timeout: 15000 
})
service.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

这是我解决这个问题的方式
代替

request.post('/manage/product/upload.do',
      param,config
    )

我使用axios直接发送请求,并且没有添加配置

axios.post('/manage/product/upload.do',
      param
    )

希望这可以解决您的问题

答案 8 :(得分:0)

较新版本的ARC(Advaced Rest客户端)还提供文件上传选项:

enter image description here