将文件上传和请求正文合并在rest控制器的单个端点上

时间:2019-03-26 06:36:40

标签: java spring rest spring-boot spring-mvc

我的Web应用程序的UI可以上传文件(csv),或在请求正文中将数据作为json发送。但是,文件上传或json请求将出现在请求中,而不是两者都出现。我正在创建一个spring rest控制器,该控制器结合了文件上传功能,还接受了请求的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请求构建两个单独的终结点,但这不能满足我的要求。因此,我正在寻找一种将两者结合的解决方案

2 个答案:

答案 0 :(得分:0)

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

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

@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);
}

答案 1 :(得分:-1)

尝试类似的东西:

{{1}}

在RequestBody中,您可以添加要发送的参数。
这不会将数据作为JSON发送。
编辑:-我忘了为Multipart文件添加变量,而我在春季错误地使用了预留关键字RequestBody。 希望对您有所帮助。