Spring 是否更改为返回类似response.png的png文件而不是response.bin
我的代码的目的是从第三方服务检索图像 为了让下载的端点正常工作,我做了一些努力,但只取得了部分成功。当我通过postman调用端点时,答案是一个.bin文件,但我需要的是一个.png文件。最大的成功是能够获得一个.png文件,并且能够自定义名称。但是,用户的个性化并不是绝对必要的 项目是使用初始值设定项生成的,具有以下依赖项:Spring 是否更改为返回类似response.png的png文件而不是response.bin,spring,spring-boot,png,spring-webflux,java-11,Spring,Spring Boot,Png,Spring Webflux,Java 11,我的代码的目的是从第三方服务检索图像 为了让下载的端点正常工作,我做了一些努力,但只取得了部分成功。当我通过postman调用端点时,答案是一个.bin文件,但我需要的是一个.png文件。最大的成功是能够获得一个.png文件,并且能够自定义名称。但是,用户的个性化并不是绝对必要的 项目是使用初始值设定项生成的,具有以下依赖项: 弹簧靴起动器 龙目 弹簧启动器webflux 反应堆弹簧 以下是我的端点的源代码: @GetMapping("/retrieve-image")
- 弹簧靴起动器李>
- 龙目
- 弹簧启动器webflux
- 反应堆弹簧
@GetMapping("/retrieve-image")
public Mono<byte[]> retrieveImage(ImageRequest request) throws ExecutionException, InterruptedException, IOException {
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
queryParams.add("attribute", request.getAttribute()); // fake for query string setting.
Mono<byte[]> image = webClient
.get()
.uri(uriBuilder -> uriBuilder
.path(Endpoint.THIRD_PARTY_SERVICE_URI)
.queryParams(queryParams)
.build())
.accept(MediaType.valueOf(String.valueOf(MediaType.IMAGE_PNG)))
.exchange()
.flatMap(clientResponse -> clientResponse.bodyToMono(byte[].class)
.doOnSuccess(body -> {
if (clientResponse.statusCode().isError()) {
log.error("HttpStatusCode = {}", clientResponse.statusCode());
log.error("HttpHeaders = {}", clientResponse.headers().asHttpHeaders());
log.error("ResponseBody = {}", body);
}
}));
return image;
}
@GetMapping(“/retrieve image”)
公共Mono retrieveImage(ImageRequest请求)引发ExecutionException、InterruptedException、IOException{
MultiValueMap queryParams=新链接的MultiValueMap();
queryParams.add(“attribute”,request.getAttribute());//查询字符串设置为false。
Mono image=webClient
.get()
.uri(uriBuilder->uriBuilder
.path(端点.第三方\服务\ URI)
.queryParams(queryParams)
.build())
.accept(MediaType.valueOf(String.valueOf(MediaType.IMAGE_PNG)))
.exchange()
.flatMap(clientResponse->clientResponse.bodytomino(字节[].class)
.doOnSuccess(正文->{
if(clientResponse.statusCode().isError()){
log.error(“HttpStatusCode={}”,clientResponse.statusCode());
log.error(“HttpHeaders={}”,clientResponse.headers().asHttpHeaders());
错误(“ResponseBody={}”,body);
}
}));
返回图像;
}
您还可以将文件的mime类型添加到@GetMapping
注释的products部分,它应该如下所示:
@GetMapping(path = "/retrieve-image",
produces = "image/png")
此外,您可以将响应包装在响应标题中,而不是返回单声道
。这使您可以添加标题并告诉浏览器文件名。例如:
HttpHeaders header = new HttpHeaders();
header.add(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=image.png");
header.add("Access-Control-Expose-Headers", "Content-Disposition");
return ResponseEntity.ok().
.headers(header)
.contentLength(Files.size(path))
.body(<<YOUR_FILE_HERE>>);
HttpHeaders header=新的HttpHeaders();
header.add(HttpHeaders.CONTENT\u处置,
“附件;文件名=image.png”);
添加(“访问控制公开标题”、“内容处置”);
返回ResponseEntity.ok()。
.标题(标题)
.contentLength(文件.size(路径))
.body();
最后一个想法:如果您将spring boot starter web和spring boot starter webflux添加到您的依赖项中,该应用程序将正常工作,但它不使用webflux中的Netty,而是使用通常的Tomcat。因此,您不会从被动功能中获益。AFAIK,不建议在同一应用程序中使用spring-webflux
。引用文档:如果您有一个SpringMVC应用程序,可以调用远程服务,请尝试使用反应式WebClient。您可以直接从SpringMVC控制器方法返回反应类型(Reactor、RxJava或其他)@Vladimirshefer你说的“梨树”是什么意思?什么是“邮寄给梨子”?@meberhard我很抱歉。这是个打字错误。谢谢你的修改。在我的端点中,我使用Mono和pojo或byte[]。你能在你的例子中写出整个端点吗?您的解决方案有哪些好处。。我正在编写一个带有rest控制器的web服务器,但我需要WebClient来调用第三方服务;RestTemplate非常旧且不适合。。。您将如何重新排列依赖项?有什么好处?谢谢