在 rest 控制器中的单个终结点上合并文件上传和请求正文



我的 Web 应用程序的 UI 能够上传文件 (csv(,或者在请求正文中将数据作为 json 发送。但是,请求中将存在文件上传或 json 请求,而不是两者兼而有之。我正在创建一个弹簧休息控制器,它结合了文件上传并接受请求 json 值。

通过邮递员测试的以下端点,我没有得到异常:

org.apache.tomcat.util.http.fileupload.FileUploadException:请求被拒绝,因为未找到多部分边界

@RestController
public class MovieController {
private static final Logger LOGGER = LoggerFactory.getLogger(MovieController.class);
@PostMapping(value="/movies", consumes = {"multipart/form-data", "application/json"})
public void postMovies( @RequestPart String movieJson, @RequestPart(value = "moviesFile") MultipartFile movieFile ) {
    // One of the below value should be present and other be null
    LOGGER.info("Movies Json Body {}", movieJson);
    LOGGER.info("Movies File Upload {}", movieFile);
}

}

感谢解决此问题的任何帮助?

注意:我能够为文件上传和 json 请求构建两个单独的端点,但这还不足以满足我的要求。因此,我正在寻找一种将两者结合起来的解决方案

尝试类似操作:

@RequestMapping(value = "/movies", method = RequestMethod.POST, consumes = { "multipart/form-data", "application/json" })
public void postMovies(
        @RequestParam(value = "moviesFile", required = false) MultipartFile file, 
  UploadRequestBody request) {

在请求正文中,您可以添加要发送的参数。
这不会将数据作为 JSON 发送。
编辑:- 我忘了为多部分文件添加变量,我错误地使用了 RequestBody 这是 spring 中的保留关键字。希望对您有所帮助。

我建议创建两个单独的端点。这将拆分和隔离不同的功能,并降低代码的复杂性。此外,测试会更容易,并提供更好的可读性。

你的客户端实际上必须知道要使用哪个变量。因此,只需为请求选择不同的终结点,而不是对同一终结点使用不同的变量。

@PostMapping(value="/movies-file-upload", consumes = {"multipart/form-data"})
public void postMoviesFile(@RequestPart(value = "moviesFile") MultipartFile movieFile ) {
    LOGGER.info("Movies File Upload {}", movieFile);
}
@PostMapping(value="/movies-upload", consumes = {"application/json"})
public void postMoviesJson( @RequestPart String movieJson) {
    LOGGER.info("Movies Json Body {}", movieJson);
}

最新更新