Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 是否更改为返回类似response.png的png文件而不是response.bin_Spring_Spring Boot_Png_Spring Webflux_Java 11 - Fatal编程技术网

Spring 是否更改为返回类似response.png的png文件而不是response.bin

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")

我的代码的目的是从第三方服务检索图像

为了让下载的端点正常工作,我做了一些努力,但只取得了部分成功。当我通过postman调用端点时,答案是一个.bin文件,但我需要的是一个.png文件。最大的成功是能够获得一个.png文件,并且能够自定义名称。但是,用户的个性化并不是绝对必要的

项目是使用初始值设定项生成的,具有以下依赖项:

  • 弹簧靴起动器
  • 龙目
  • 弹簧启动器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非常旧且不适合。。。您将如何重新排列依赖项?有什么好处?谢谢