尝试创建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()));
}
欢迎使用更多精美的解决方案