Попытка создать конечную точку 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"})
.Что я делаю не так?Как определить другой тип контента, зависит от двоичного файла ресурса?
РЕШЕНИЕ
В рамках процесса загрузки я определяю MediaType файла на основе расширения файла и сохраняю его с другимиметаданные файла в дБ.Затем я использую этот сохраненный 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()));
}
Приветствуются более модные решения