【发布时间】:2026-02-01 21:50:01
【问题描述】:
使用 apache http 客户端,在文件下载期间我可以使用
response.getFirstHeader("Content-Disposition").getValue();
现在我正在切换到 webflux 来下载如下文件:
final Flux<DataBuffer> dataBufferFlux = client.get()
.accept(MediaType.APPLICATION_OCTET_STREAM)
.retrieve()
.bodyToFlux(DataBuffer.class);
final Path path = FileSystems.getDefault().getPath("/file/path/name.pdf");
DataBufferUtils
.write(dataBufferFlux, path, StandardOpenOption.CREATE)
.block();
问题:如何在 webflux 中获取与内容/标题相关的选项?
更新
我做得很好:
ClientResponse response = client.get().uri(uri)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.headers(headers -> headers.setBasicAuth("admin", "admin"))
.exchange()
.block();
它给了我想要的东西 - System.out.println("File response asHttpHeaders :: "+response.headers().asHttpHeaders().getContentDisposition());
输出:
File response asHttpHeaders :: attachment; filename*=UTF-8''TestPdf.pdf
但我不想让它看起来很丑。我想知道是否可以在上面的原始代码(使用 dataBufferFlux)中获取此信息。
应用程序:
我有一个应用程序,我需要使用来自另一个应用程序的 rest API 在暂存区批量下载文件(每周数百万个文件),该应用程序不是完全反应式的。所以整个想法是在我的第一个代码(dataBufferFlux)中截取标题信息,以便我可以即时设置文件名和内容类型。
简单(重构)问题:
有没有一种方法可以在将文件写入暂存区(NAS 驱动器)时检索标题信息以获取文件的文件名和内容类型。
【问题讨论】:
-
But I don't want to make it look ugly这是一个非常主观的事情。此外,您还没有说明使用标头的目的、需要它的位置以及原因。此外,您正在使用block,这不应该在 spring webflux 中完成(我假设您有一个纯 webflux 应用程序,因为您标记了它),情况就是如此。调用block是错误的。投票结束,因为没有明确的问题或意图。 -
你读过哪本书说我们不能使用 block 并且在 webflux 中使用它是错误的?请赐教我们。!你对同步和异步有什么想法吗?当我说我不想让它变得丑陋时,这意味着我不想通过两次调用来实现一件事。
-
@Toerktumlare,这是您的第一篇文章-顺便说一下您自己的答案-*.com/questions/57355725/…
-
是的,在我的回答中,我明确写道,如果您有一个纯 webflux 应用程序,则在任何情况下都不应使用阻塞。所以如果你有那个,那么不要使用块。而“书”是官方的reactor文档,它是spring webflux中的底层库。参考:projectreactor.io/docs/core/release/reference/…
-
使用 webflux 的全部目的是“非阻塞”。如果你不明白这一点,那么你应该阅读反应器的基础知识以及为什么首先发明 webflux。
标签: spring spring-boot spring-webflux