说到 WebFlux 就要提到和对比 Servlet,这样也是为了保留和尽量靠近传统代码的实现逻辑,所以最常用的就是对请求的输入流和响应的输出流处理。
在 Servlet 中获取输入流和输出流HttpServletRequest request;
HttpServletResponse response;
InputStream inputStream = request.getInputStream();
OutputStream outputStream = response.getOutputStream();
在 WebFlux 中获取输入流和输出流
1、OutputStream 输出流的应用代码片段示例
public Mono<Void> handle(ServerHttpResponse response) {
DataBuffer dataBuffer = response.bufferFactory().allocateBuffer();
// 获得 OutputStream 的引用
OutputStream outputStream = dataBuffer.asOutputStream();
// *** 作 outputStream 往里面写入数据
......
......
......
// 将 dataBuffer 输出到 response
return response.writeWith(Mono.just(dataBuffer));
}
2、InputStream 输入流的应用代码片段示例
public Mono<Void> handle(ServerHttpRequest request) {
return request.getBody().collect(ServerHttpConnection.InputStreamCollector::new,
(t, dataBuffer) -> t.collectInputStream(dataBuffer.asInputStream()))
.flatMap(inputStreamCollector -> {
// 将输入流多个dataBuffer合并为一个InputStream后使用
InputStream requestInputStream = inputStreamCollector.getInputStream();
// *** 作 inputStream 读取数据并处理
......
......
......
// 这里返回 empty 只是示例,实际使用根据自己需求返回对应数据
return Mono.empty();
});
}
其中合并多个 InputStream 使用 Java 的 SequenceInputStream 来处理,以下为内部类代码
static class InputStreamCollector {
private InputStream is;
public void collectInputStream(InputStream is) {
if (this.is == null) this.is = is;
this.is = new SequenceInputStream(this.is, is);
}
public InputStream getInputStream() {
return this.is;
}
}
以上关于输入和输出流的代码可以应用于文件的上传和下载。
(END)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)