添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; @RestController @RequestMapping("/orders") public class OptimizedOrderController { @Autowired private OrderService orderService; * 处理订单导出请求,使用StreamingResponseBody实现流式响应。 * 这样做可以确保即使有大量的订单数据也不会导致内存溢出, * 同时可以让用户更快地开始接收文件。 @GetMapping("/export") public ResponseEntity<StreamingResponseBody> exportOrders() { // 创建StreamingResponseBody实例,该对象将在每次有新数据可写时被调用 StreamingResponseBody stream = outputStream -> { int pageSize = 1000; // 每页查询的数量 int pageNumber = 0; // 分页起始页码 boolean hasMoreData = true; // 是否还有更多数据标志 try { // 循环直到所有数据都被处理完毕 while (hasMoreData) { // 构造分页请求参数 PageRequest pageRequest = PageRequest.of(pageNumber++, pageSize, Sort.by("id")); // 执行分页查询 Page<Order> page = orderService.findPage(pageRequest); // 遍历当前页的数据,并逐行写入输出流 for (Order order : page.getContent()) { writeOrderToExcelRow(order, outputStream); // 更新是否有更多数据的标志 hasMoreData = page.hasNext(); } catch (IOException e) { // 如果发生IO异常,记录日志或采取其他措施 e.printStackTrace(); // 设置HTTP头信息,告知浏览器这是一个附件下载 HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=orders.xlsx"); // 返回包含StreamingResponseBody的ResponseEntity对象 return ResponseEntity.ok() .headers(headers) .contentType(MediaType.APPLICATION_OCTET_STREAM) // 设置响应的内容类型为二进制流 .body(stream); // 将StreamingResponseBody作为响应体 * 将单个订单转换成一行Excel格式,并写入到提供的输出流中。 * 注意:这里简化了实际的Excel写入逻辑,具体实现依赖于所使用的库(如Apache POI)。 private void writeOrderToExcelRow(Order order, OutputStream outputStream) throws IOException { // 实现将单个订单写入Excel文件的一行 // 此处省略具体实现细节...
我们可以通过返回 StreamingResponseBody 来直接使用返回的OutputStream来自己控制 数据 返回。我们也可以使用ResponseEntity来定制状态和头的信息。 本例使用 StreamingResponseBody 返回一张图片,示例控制器如下: @RestController @RequestMapping("/async") @Slf4j public class AsyncController { @Value("classpath : wyn.jpg") //1
StreamingResponseBody - 处理 Servlet异步请求 StreamingResponseBody 是Spring 4.2版本添加的一个新的接口,在Controller里 处理 输出流时非常有用。 我们在 java 中创建I/O输入输出流时,一般用完流后都要关闭流,但是在Controller里面, 处理 Http request是异步的,这个时候如果往request里写入流的时候,我们无法确...
* @Description : 支持返回值为 StreamingResponseBody 或 ResponseEntity< StreamingResponseBody > public boolean supportsReturnType(MethodPar
上篇博文:【小家Spring】高性能关键技术之—体验Spring MVC的异步模式(Callable、WebAsyncTask、DeferredResult) 基础使用篇 介绍了Spring MVC异步模式的基本使用,相信小伙伴们基本的使用都能运用自如了。 那么本篇文章主要介绍一下异步模式的高级使用(主要是DeferredResult)以及原理过程分析,废话不多说,进入正题 Deferred...
` StreamingResponseBody `是Spring框架中的一个接口,它用于 处理 HTTP响应中的流式 数据 ,特别适合于大文件或者无限长度的内容。在RESTful API中,当需要返回大量内容而不想一次性加载到内存中时,可以使用这个接口。通过实现` StreamingResponseBody `,你可以自定义如何分块发送 数据 ,这样客户端可以逐块接收和 处理 ,而不是等待整个响应完成。 例如,在Spring MVC控制器中,你可以这样做: ``` java @GetMapping("/large-file") public ResponseEntity< StreamingResponseBody > getLargeFile() { final byte[] fileData = ... // 获取大文件 数据 return ResponseEntity.ok() .headers(contentLengthResponseHeaders(fileData.length)) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(() -> new ResourceResponseBody(new ByteArrayInputStream(fileData))); 这里,`ResourceResponseBody`就是实现了` StreamingResponseBody `的类,它会将字节数组转换成输入流,并按需提供给客户端。