首页 > 系统相关 >大文件下载防内存溢出简单实现

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

时间:2025-01-05 22:12:44浏览次数:7  
标签:文件 溢出 header 内存 downloadFile executor new 下载

摘要:利用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>

 

标签:文件,溢出,header,内存,downloadFile,executor,new,下载
From: https://www.cnblogs.com/gdwkong/p/18654054

相关文章

  • ​SQLite​的下载与安装(简洁版),附带建表和四个基本的增删改查语句
    1.下载SQLite安装包SQLiteDownloadPage下载后解压执行sqlite3.exe2.创建数据库.open[路径+数据库名字]【Tips:没有找到指定的数据库文件则会默认创建】.openckk.db3.建表和四个基本的增删改查语句数据类型常用的有:int整形、real浮点数、text文本、blob......
  • Python数据结构与算法分析 第3版PDF、EPUB免费下载
    适读人群:1.希望学习数据结构和算法的Python用户;2.计算机专业的学生和老师。只有洞彻数据结构与算法,才能真正精通Python!热门计算机科学教材,华盛顿大学、北京大学等多家高校采用,让你在代码编写的战场上所向披靡!电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版......
  • 动手深度学习-PyTorch(第二版)PDF、EPUB免费下载
    电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍点击原文去下载书籍信息作者:阿斯顿·张(AstonZhang)/李沐(MuLi)/[美]扎卡里·C.立顿(ZacharyC.Lipton)/[德]亚历山大·J.斯莫拉(AlexanderJ.Smola)出版社:人民邮电出版社出品方:异步图书译......
  • Effective Java中文版(原书第3版)PDF、EPUB免费下载
    EffectiveJava中文版(原书第3版)PDF、EPUB免费下载适读人群:本书并非面向Java初学者,而是要求读者有一定的Java编程经验。对于在Java开发方面已经积累一定经验的读者而言,本书可以帮助其更深入地理解Java编程语言,以成为更卓越、高效的Java开发人员。Jolt获奖作品全新升级,与《Java编......
  • Java核心技术·卷 II(原书第11版):高级特性PDF、EPUB免费下载
    适读人群:使用Java技术进行实际项目开发的编程人员针对JavaSE9、10和11全面升级,畅销20载的大师之作,Jolt大奖得主,全球百万Java工程师口碑选择,提供部分作者亲授视频+海量示例代码电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍点击原文去下载书籍信息作......
  • 10个国外知名的免费图片下载网站
    在互联网时代,获取高质量的免费图片资源对于设计师、博主和内容创作者至关重要。为了帮助大家更高效地找到合适的素材,我整理了10个国外知名的免费图片下载平台。这些网站不仅提供高分辨率的照片,还允许用于商业项目,适合各种创意工作。以下是这些平台的介绍:Unsplash网址:[https:......
  • 【嵌入式编程】内存分布
    一、内存分布图在操作系统中,内存被组织和管理以支持进程的运行。以下是一些常见的内存分布概念:【内核空间】:操作系统内核使用的内存区域,用于存储内核代码、数据结构和进程控制块(PCB)。【用户空间】:存储用户的代码。未初始化变量区(.bss):存放未初始化的全局变量和静态变......
  • 计算机毕设项目100paa93+springboot基于Android的酒店预订系统,计算机毕业生可参考,免费
    springboot基于Android的酒店预订系统摘 要基于Android平台的酒店预订系统App是一款专为移动用户设计的应用程序,它允许用户通过智能手机或平板电脑方便快捷地进行酒店搜索、预订及管理。这款App拥有一个直观的用户界面,为用户提供了广泛的功能,包括浏览酒店信息、查看房间价......
  • 计算机毕设项目28r41260+springboot基于Hadoop的豆瓣电子图书推荐系统统,计算机毕业生
    基于Hadoop实现的豆瓣电子图书推荐系统的设计与实现摘 要随着开数字化阅读的普及,豆瓣电子图书推荐系统应运而生,旨在为用户提供个性化的阅读体验。基于Hadoop的强大数据处理能力,该系统能够有效处理海量用户数据和书籍信息,通过复杂的算法模型为用户推荐高质量的内容。管理员......
  • 计算机毕设项目o904d6p1+springboot基于微信小程序的城市公交查询系统,计算机毕业生可
    springboot基于微信小程序的城市公交查询系统摘   要当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统城市公交查询管理采取了人......