请求被拒绝,因为在 Springboot 中没有找到多部分边界

因为我正在尝试这与弹簧启动和邮递员铬附加组件的网络服务。

在邮递员 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;
}
212876 次浏览

问题是,您正在设置的 Content-Type自己,让它是空白的。谷歌浏览器将为你做到这一点。多部分 Content-Type需要知道文件边界,当您删除 Content-Type时,Postman 将自动为您做到这一点。

“ Postman-REST Client”不适合通过设置 content-type 来执行 post 操作。您可以尝试使用“高级 REST 客户端”或其他。

此外,从 Spring 3.1 M2开始,Header 就被使用和生产所替代,参见 https://spring.io/blog/2011/06/13/spring-3-1-m2-spring-mvc-enhancements

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

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

postman

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

Sample

这对我很有效: 通过 Postman 上传一个文件到 SpringMVC 后端 webapp:

后端: Endpoint controller definition

邮递员: Headers setup POST Body setup

当我使用邮递员向外部网络发送一个5.6 M 的文件时,我面临同样的问题。同样的操作在我自己的计算机和本地测试环境中得以实现。

在检查了所有服务器配置和 HTTP 头之后,我发现原因是 Postman 可能在模拟对外部 HTTP 请求的请求时遇到了一些麻烦。 最后,我成功地在 chrome HTML 页面上执行了 sendfile 请求。 仅供参考:)

我遇到这个问题是因为我使用了基于 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
)

希望这能解决你的问题

更新版本的 ARC (高级休息客户端)也提供了文件上传选项:

enter image description here

听说你在邮递员那里也能做到:

placeholders

您可以尝试使用下面的简单代码,它应该工作。我测试了高级 REST 客户端和下面附加的屏幕截图将有助于配置。

package com.example.demo;


import java.io.FileOutputStream;
import java.io.IOException;


import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;


@RestController
public class ImageUploadController {


@PostMapping("image-upload")
public String uploadImage(@RequestParam MultipartFile myFile) throws IOException {
        

byte[] bytes = myFile.getBytes();


FileOutputStream fileOutputStream = new FileOutputStream("image.jpg");


fileOutputStream.write(bytes);
fileOutputStream.close();
        

return "Image uploaded successfully..!";


}
}

enter image description here

你可以在项目下面的位置找到上传的图片。

enter image description here

还请注意,如果您的控制器应该在@SpringBootApplication 包的包中。

enter image description here