覆盖默认消息转换器MediaType

时间:2018-10-22 14:53:17

标签: spring-boot spring-webflux media-type

尝试创建REST端点,以下载PNG,SVG,JPG,GIF格式的图像。我面临的第一个问题是:

  • 如果我定义@GetMapping(produces = MediaType.IMAGE_PNG_VALUE),那么我将设法下载PNG文件,但是此端点应支持多种不同的媒体类型文件下载-png,svg,jpg,gif。

  • 如果我定义@GetMapping(produces = {MediaType.IMAGE_PNG_VALUE, "image/svg+xml"})并尝试下载SVG文件,则该文件可能会解释为image/png而不是image/svg+xml

那是我的FileController:

@RestController
@RequestMapping("/v1/files")
public class FileController {

    @GetMapping(value = "/{id}", produces = {MediaType.IMAGE_PNG_VALUE, "image/svg+xml"})
    public Mono<Resource> download(@PathVariable UUID id) {
        return fileService.download(id);
    }

}

我做错了什么?

思想:

应该使用以下方式覆盖默认媒体类型:

@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {

    @Override
    public void configureContentTypeResolver(RequestedContentTypeResolverBuilder builder) {
        builder.fixedResolver(MediaType.valueOf("image/svg+xml"), MediaType.IMAGE_PNG);
    }

}

但仍然与@GetMapping(produces = {MediaType.IMAGE_PNG_VALUE, "image/svg+xml"})相同。我做错了什么? 如何定义不同的内容类型取决于Resource二进制文件?

解决方案

在上传过程中,我根据文件扩展名检测文件的MediaType并将其与其他文件元数据一起保存在db中。然后,通过以下方式在下载过程中使用此保存的MediaType:

@GetMapping(value = "/{id}")
public Mono<ResponseEntity> download(@PathVariable UUID id) {
    return fileService.download(id)
                      .map(tuple -> ResponseEntity.ok()
                                                  .contentType(tuple.getT1().getMediaType())
                                                  .body(tuple.getT2()));
}

欢迎使用更多精美的解决方案

0 个答案:

没有答案