大文件下载防内存溢出简单实现

news/2025/1/7 13:24:48/文章来源:https://www.cnblogs.com/gdwkong/p/18654054
摘要:利用StreamingResponseBody来防止内存溢出,实现大文件下载。
一、配置异步请求超时时间
 1 /**
 2  * @Description: 异步请求配置类
 3  * @Date: Created in 17:19 2025/1/5
 4  * @Author: Cenobitor
 5  * @Modified By:
 6  * @since 0.1.0
 7  */
 8 @Configuration
 9 @EnableWebMvc
10 public class WebConfig implements WebMvcConfigurer {
11 
12     @Override
13     public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
14         configurer.setTaskExecutor(taskExecutor());
15         // 超时时间设置为6000s
16         configurer.setDefaultTimeout(TimeUnit.SECONDS.toMillis(6000));
17     }
18 
19     private AsyncTaskExecutor taskExecutor() {
20         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
21         executor.setCorePoolSize(10); // 核心线程数
22         executor.setMaxPoolSize(20);  // 最大线程数
23         executor.setQueueCapacity(500); // 队列容量
24         executor.setThreadNamePrefix("Async-");
25         executor.initialize();
26         return executor;
27     }
28 }

二、本地、远程文件下载请求接口

 1  @RequestMapping( "/downloadFile")
 2     public ResponseEntity<StreamingResponseBody> downloadFile() {
 3         long start = System.currentTimeMillis();
 4         try {
 5             Path filePath = Paths.get("E:\\macOS Catalina 10.15 正式版 19A583 macOShome.com.dmg");
 6             StreamingResponseBody responseBody = outputStream -> {
 7                 try (InputStream inputStream = Files.newInputStream(filePath)) {
 8                     StreamUtils.copy(inputStream, outputStream);
 9                 }
10             };
11             HttpHeaders header = new HttpHeaders();
12             header.setContentDispositionFormData("attachment", "macOS.dmg");
13             header.setContentType(MediaType.APPLICATION_OCTET_STREAM);
14             return new ResponseEntity<>(responseBody,header, HttpStatus.OK);
15         } catch (Exception e) {
16             throw new RuntimeException(e);
17         } finally {
18             long end = System.currentTimeMillis();
19             System.out.println("downloadFile cost: " + (end - start) + "ms");
20         }
21     }
22 
23     @RequestMapping( "/downloadRemoteFile")
24     public ResponseEntity<StreamingResponseBody> downloadRemoteFile() {
25         long start = System.currentTimeMillis();
26         try {
27             StreamingResponseBody responseBody = outputStream -> {
28                 URL resourceUrl = new URL("https://cdn.mysql.com/Downloads/MySQL-9.1/mysql-9.1.0-winx64-debug-test.zip");
29                 try (InputStream inputStream = new UrlResource(resourceUrl).getInputStream()) {
30                     StreamUtils.copy(inputStream, outputStream);
31                 }
32             };
33             HttpHeaders header = new HttpHeaders();
34             header.setContentDispositionFormData("attachment", "mysql.zip");
35             header.setContentType(MediaType.APPLICATION_OCTET_STREAM);
36             return new ResponseEntity<>(responseBody,header, HttpStatus.OK);
37         } catch (Exception e) {
38             throw new RuntimeException(e);
39         } finally {
40             long end = System.currentTimeMillis();
41             System.out.println("downloadFile cost: " + (end - start) + "ms");
42         }
43     }

三、前端页面代码

 1 <template>
 2   <div class="download-wrap">
 3     <el-button type="primary" icon="el-icon-download" size="sm>ll" @click="downloadFile">下载文件</el-button>
 4     <el-button type="primary" icon="el-icon-download" size="sm>ll" @click="downloadRemoteFile">下载远程文件</el-button>
 5   </div>
 6 </template>
 7 
 8 <script>
 9 import axios from "axios";
10 
11 export default {
12   name: 'HelloWorld',
13   props: {
14     msg: String
15   },
16 
17   methods:{
18     downloadFile() {
19       console.log('下载文件开始');
20       const downloadUrl = 'http://localhost:8080/downloadFile'; // 文件下载的链接
21       window.open(downloadUrl);
22       console.log('下载文件完成');
23     },
24     downloadRemoteFile() {
25       console.log('下载文件开始');
26       const downloadUrl = 'http://localhost:8080/downloadRemoteFile'; // 文件下载的链接
27       window.open(downloadUrl);
28       console.log('下载文件完成');
29     },
30   },
31   mounted() {
32     axios.get('http://localhost:8080/hello').then(res => {
33       console.log(res);
34     });
35   },
36 }
37 </script>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864581.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024-2025-1 20241409《计算机基础与程序设计》第十五周学习总结

自我介绍很高兴加入2024计算机基础与程序设计 (北京电子科技学院 - 网络空间安全)的班级的大家庭。 第一周作业1.对《计算机基础与程序设计》进行了概述,有了基础的了解。 2.学习了有关2进制、8进制、10进制、16进制之间的转换。 第二周作业1.学习了《计算机科学概论》第一章,…

前端性能优化原理与实践笔记

知识体系与小册格局 写给读者 提起性能优化,大家现在脑海里第一时间会映射出什么内容呢? 可能是类似“雅虎军规”和《高性能 JavaScript》这样历久弥香的经典之作,也可能是搜索引擎聚合给你的一篇又一篇以性能优化为主题的个人或团队实践而来的“私货”。至少当我确定自己的…

20241420 《计算机基础与程序设计》课程总结

20241420 《计算机基础与程序设计》课程总结 每周作业链接汇总 第0周作业:自我介绍与展望 https://www.cnblogs.com/vincent2077/p/18432491第一周作业:安装Linux系统并根据每章内容提出先导提问 https://www.cnblogs.com/vincent2077/p/18438668第二周作业:《计算机科学概论…

2024-2025-1 20241317 《计算机基础与程序设计》课程总结

学号20241317 《计算机基础与程序设计》课程总结 (按顺序)每周作业链接汇总 第0周作业:自我介绍第一周作业:AI学习第二周作业:c语言程序设计第一章第三周作业:c语言程序设计第二章第四周作业:c语言程序设计第三章第五周作业:c语言程序设计第四章第六周作业:c语言程序设…

Linux服务器无Root权限安装Cuda方法及问题解决

CUDA 简介 什么是 CUDA ? CUDA(Compute Unified Device Architecture)是由 NVIDIA 提供的一种并行计算平台和编程模型,用于加速计算密集型任务。CUDA 允许开发者使用 GPU 的计算能力,通过并行处理来快速执行复杂的计算任务。 CUDA 包括以下主要组成部分:CUDA Toolkit:为…

开启家具组装新方式:产品说明书智能指导

在快节奏的现代生活中,人们越来越追求便捷与高效。无论是新房装修还是家具换新,家具组装已成为许多家庭不可避免的一项任务。然而,面对复杂多变的家具图纸和冗长的产品说明书,许多人常常感到无从下手,甚至因操作不当而损坏零件。为了解决这一难题,一种全新的家具组装方式…

2024-2025-1 20241408陈烨南《计算机基础与程序设计》课程总结

每周作业链接汇总 第0周作业 自我介绍 https://www.cnblogs.com/chenyenai/p/18432520第1周作业 计算机基础与程序设计中的问题提问 https://www.cnblogs.com/chenyenai/p/18439433第2周作业 阅读《计算机科学概论》第一章和《C语言程序设计》第一章,并进行总结 https://www.c…

# 学期(如2024-2025-1) 学号(如:20241402) 《计算机基础与程序设计》第15周学习总结

学期(如2024-2025-1) 学号(如:20241402) 《计算机基础与程序设计》第15周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个…

SpringBoot进阶教程(八十四)spring-retry

在日常的一些场景中, 很多需要进行重试的操作.而spring-retry是spring提供的一个基于spring的重试框架,某些场景需要对一些异常情况下的方法进行重试就会用到spring-retry。spring-retry可以帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有配置都是基于简单…

制造业知识中台:推动智能制造转型升级的智慧大脑

在当今全球制造业的激烈竞争中,智能制造已成为推动产业升级、提升竞争力的关键路径。制造业知识中台,作为连接数据、知识与业务的智慧中枢,正逐步展现出其在推动智能制造转型升级中的巨大潜力。它不仅能够帮助企业实现知识的有效整合与高效利用,还能通过智能化分析与应用,…

电子配件行业的未来之路:产品说明书数字化转型的力量

在科技飞速发展的今天,电子配件行业作为科技创新的前沿阵地,正经历着前所未有的变革。从智能手机、平板电脑到智能穿戴设备,各种新型电子配件层出不穷,极大地丰富了人们的生活。然而,随着产品种类的增多和功能的复杂化,如何确保消费者能够快速、准确地理解和使用这些产品…

基于四象限比例积分控制器的直流电机控制系统simulink建模与仿真

1.课题概述 基于四象限比例积分控制器的直流电机控制系统simulink建模与仿真。2.系统仿真结果 3.核心程序与模型 版本:MATLAB2022a4.系统原理简介直流电机由于其较好的调速性能和较高的控制精度,被广泛应用于各种工业控制场合。为了实现对直流电机转速和位置的精确控制,控制…