任務中心示例及瀏覽器強制高效下載實踐

1. 效果展示

任務中心
這里的進度展示,可以通過我們之前講到的Vue3實現類ChatGPT聊天式流式輸出(vue-sse實現) SSE技術實現,比如用戶點擊全量下載時,后臺需要將PDF文件打包為ZIP文件,由于量較大,需要展示進度,用戶點擊全量下載后后可到任務中心查看進度。對于任務中心的下載我們如果用瀏覽器自帶下載功能,可以如下

2. 瀏覽器強制高效下載

@Overridepublic void downloadStream(String fileId, HttpServletResponse response) {Path filePath = Paths.get(Constant.FILE_PREFIX + fileId);String fileName = filePath.getFileName().toString();try {if (!Files.exists(filePath)) {response.setStatus(HttpServletResponse.SC_NOT_FOUND);throw new RuntimeException("File not found: " + filePath);}String contentType = Files.probeContentType(filePath);response.setContentType(contentType != null ? contentType : MediaType.APPLICATION_OCTET_STREAM_VALUE);response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");response.setContentLengthLong(Files.size(filePath));String acceptEncoding = response.getHeader("Accept-Encoding");if (acceptEncoding != null && acceptEncoding.contains("gzip")) {response.setHeader("Content-Encoding", "gzip");try (FileChannel channel = FileChannel.open(filePath, StandardOpenOption.READ);GZIPOutputStream gzipOut = new GZIPOutputStream(response.getOutputStream())) {channel.transferTo(0, channel.size(), Channels.newChannel(gzipOut));}} else {try (FileChannel channel = FileChannel.open(filePath, StandardOpenOption.READ);OutputStream out = new BufferedOutputStream(response.getOutputStream(), BUFFER_SIZE)) {channel.transferTo(0, channel.size(), Channels.newChannel(out));}}} catch (IOException e) {response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);throw new RuntimeException("Failed to download file: " + e.getMessage(), e);}}

3. 任務中心示例

<template><div class="task"><el-row style="margin: 20px"><el-table :data="dataList" @current-change="handleCurrentChange" border highlight-current-row :header-cell-style="setRowClass" :cell-style="{ textAlign: 'center' }" stripe><el-table-column prop="taskId" label="任務編號"> </el-table-column><el-table-column prop="taskName" label="任務名稱"></el-table-column><el-table-column prop="progress" label="任務進度"><template #default="scope"><el-progress :percentage="scope.row.progress" :color="progressColor"/></template></el-table-column><el-table-column prop="statusDesc" label="任務狀態"></el-table-column><el-table-column prop="createUser" label="創建人"></el-table-column><el-table-column prop="createTime" label="創建日期"><template v-slot="scope">{{ $formatDate(scope.row.createTime, 'yyyy-MM-dd') }}</template></el-table-column><el-table-column prop="operate" align="center" label="操作" width="170px"><template v-slot="scope"><el-button type="primary" size="small" :icon="Download"@click="handleDownload(scope.row)">下載</el-button></template></el-table-column></el-table></el-row><el-row style="float:right; margin-top: 15px;"><paginationbackground@pagination="updatePageInfo":page-size="page.pageSize"v-model:current-page="page.pageNumber":total="page.total"></pagination></el-row></div>
</template>
<script>
import {Delete, Download, Edit, Plus, Search} from "@element-plus/icons-vue";
import Pagination from "@/components/pagination/Index.vue";
import baseUrl from "../../util/baseUrl";export default {name: 'task',computed: {Delete() {return Delete},Edit() {return Edit},Plus() {return Plus},Search() {return Search},Download() {return Download},},components: {Pagination},data() {return {tree: [],dataList: [],// 查詢條件query: {username: '',account: ''},// 選中樹節點信息currentTreeNode: '',// 表格選中行信息currentRow: '',visible: {add: false,edit: false},progressColor: [{color: '#f56c6c', percentage: 20},{color: '#e6a23c', percentage: 40},{color: '#5cb87a', percentage: 60},{color: '#1989fa', percentage: 80},{color: '#6f7ad3', percentage: 100},],page: {pageNumber: 1,pageSize: 10,total: 10},importCustomData: false,fileUpload: {label: '',fileList: [],},url: ''}},created() {// 無需跨域,否則無法接收消息, 這個原因浪費我好多時間if (process.env.NODE_ENV === 'development') {this.url = 'http://127.0.0.1:8080/sse/subscribe?token=' + this.$store.getters.token} else {this.url = 'https://api-uat.sfxs.com/sse/subscribe?token=' + this.$store.getters.token}this.listData()},mounted() {this.connect()},methods: {connect () {// create the client with the user's configconst self = thislet client = self.$sse.create({url: this.url,includeCredentials: false})client.on('message', (data) => {// eslint-disable-next-line no-emptyif (data === '<SSE_START>') {} else {const ret = JSON.parse(data)self.dataList.forEach((item, index, arr) => {if (ret['taskId'] === item['taskId']) {// 更細進度與狀態self.dataList[index]['progress'] = ret['progress']self.dataList[index]['statusDesc'] = ret['statusDesc']}})}})client.on('error', () => { // eslint-disable-lineconsole.log('[error] disconnected, automatically re-attempting connection', 'system')})// and finally -- try to connect!client.connect() // eslint-disable-line.then(() => {console.log('[info] connected', 'system')}).catch(() => {console.log('[error] failed to connect', 'system')})},listData() {const self = thisself.$http.post('/task/list', self.query, 'apiUrl').then(res => {self.dataList = res.recordsself.page.total = res.total})},handleCurrentChange (val) {if (val) {this.currentRow = val}},setRowClass () {return {background: '#F3F3F3', textAlign: 'center', color: 'black'}},updatePageInfo (data) {const self = thisself.page.pageNumber = data.pageNumberself.page.pageSize = data.pageSizeself.listData()},handleDownload(row) {const self = thisself.visible.add = truewindow.open(baseUrl.apiUrl + '/download/stream?fileId=' + row.url, "_blank");}}
}
</script>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83411.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot整合Flowable【08】- 前后端如何交互

引子 在第02篇中&#xff0c;我通過 Flowable-UI 繪制了一個簡單的績效流程&#xff0c;并在后續章節中基于這個流程演示了 Flowable 的各種API調用。然而&#xff0c;在實際業務場景中&#xff0c;如果要求前端將用戶繪制的流程文件發送給后端再進行解析處理&#xff0c;這種…

2025 Java面試大全技術文章大綱

2025 Java面試大全技術文章大綱 基礎篇 Java核心語法 數據類型與包裝類自動裝箱與拆箱原理String、StringBuffer、StringBuilder區別final關鍵字作用場景 面向對象特性 多態的實現機制抽象類與接口的異同設計模式&#xff1a;單例的七種寫法泛型擦除與橋接方法 進階篇 J…

Python aiohttp 全面指南:異步HTTP客戶端/服務器框架

邊寫代碼零食不停口 盼盼麥香雞味塊 、卡樂比&#xff08;Calbee&#xff09;薯條三兄弟 獨立小包、好時kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸 邊寫代碼邊貼面膜 事業美麗兩不誤 DR. YS 野森博士【AOUFSE/澳芙雪特證】377專研美白淡斑面膜組合 優惠劵 別光顧寫…

歸并排序:高效穩定的分治算法

歸并排序 歸并排序采用分治策略實現穩定排序&#xff0c;其核心思想是將序列遞歸分解后進行有序合并。 def merge_sort(arr):if len(arr) < 1:return arrmid len(arr) // 2left merge_sort(arr[:mid])right merge_sort(arr[mid:])result []i j 0while i < len(le…

go語言基礎|slice入門

slice slice介紹 slice中文叫切片&#xff0c;是go官方提供的一個可變數組&#xff0c;是一個輕量級的數據結構&#xff0c;功能上和c的vector&#xff0c;Java的ArrayList差不多。 slice和數組是有一些區別的&#xff0c;是為了彌補數組的一些不足而誕生的數據結構。最大的…

網絡攻防技術九:網絡監聽技術

文章目錄 一、網絡監聽概述二、網絡流量劫持三、數據采集與解析四、網絡監聽檢測與防范1、檢測實施監聽主機2、防范網絡通信被監聽 一、網絡監聽概述 主要解決問題&#xff1a;網絡流量劫持、在監聽點上采集并分析網絡數據。主要涉及網卡數據采集、協議分析技術。 二、網絡流量…

Cat.1與Cat.4區別及應用場景

Cat.1 和 Cat.4 都是 LTE&#xff08;4G&#xff09;網絡中的終端設備類別&#xff0c;主要區別在于 數據傳輸速率、復雜度和功耗&#xff0c;這直接影響了它們的應用場景和成本。 以下是它們的主要區別&#xff1a; 數據傳輸速率 (核心區別)&#xff1a; Cat.1 (Category 1)&…

【后端高階面經:架構篇】51、搜索引擎架構與排序算法:面試關鍵知識點全解析

一、搜索引擎核心基石&#xff1a;倒排索引技術深度解析 &#xff08;一&#xff09;倒排索引的本質與構建流程 倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎實現快速檢索的核心數據結構&#xff0c;與傳統數據庫的正向索引&#xff08;文檔→關鍵詞&#xff0…

深度學習入門:從零搭建你的第一個神經網絡

深度學習入門&#xff1a;從零搭建你的第一個神經網絡 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 深度學習入門&#xff1a;從零搭建你的第一個神經網絡摘要引言第一章&#xff1a;神經網絡基礎原理1.1 神經元…

Hadoop 3.x 偽分布式 8088端口無法訪問問題處理

【Hadoop】YARN ResourceManager 啟動后 8088 端口無法訪問問題排查與解決(偽分布式啟動Hadoop) 在配置和啟動 Hadoop YARN 模塊時&#xff0c;發現雖然 ResourceManager 正常啟動&#xff0c;JPS 進程中也顯示無誤&#xff0c;但通過瀏覽器訪問 http://主機IP:8088 時卻無法打…

docker B站學習

鏡像是一個只讀的模板&#xff0c;用來創建容器 容器是docker的運行實例&#xff0c;提供了獨立可移植的環境 https://www.bilibili.com/video/BV11L411g7U1?spm_id_from333.788.videopod.episodes&vd_sourcee60c804914459274157197c4388a4d2f&p3 目錄掛載 尚硅谷doc…

鴻蒙OSUniApp微服務架構實踐:從設計到鴻蒙部署#三方框架 #Uniapp

UniApp微服務架構實踐&#xff1a;從設計到鴻蒙部署 引言 在最近的一個大型跨平臺項目中&#xff0c;我們面臨著一個有趣的挑戰&#xff1a;如何在UniApp框架下構建一個可擴展的微服務架構&#xff0c;并確保其在包括鴻蒙在內的多個操作系統上流暢運行。本文將分享我們的實踐…

Freemarker快速入門

Freemarker概述 FreeMarker 是一款 模板引擎&#xff1a; 即一種基于模板和要改變的數據&#xff0c; 并用來生成輸出文本(HTML網頁&#xff0c;電子郵件&#xff0c;配置文件&#xff0c;源代碼等)的通用工具。 它不是面向最終用戶的&#xff0c;而是一個Java類庫&#xff0c…

操作系統:生態思政

操作系統&#xff1a;生態思政 操作系統&#xff08;OS&#xff09;作為數字世界的基石&#xff0c;其意義遠超單純的技術平臺。它構建了一個包含開發者、用戶、硬件廠商在內的復雜生態系統&#xff0c;其設計理念、運行規則與生態治理模式&#xff0c;無不深刻映射著特定的價…

二進制安全-OpenWrt-uBus

1 需求 需求&#xff1a;ubus list 需求&#xff1a;ubus -v list 需求&#xff1a;ubus -v list zwrt_router.api 2 接口 rootOpenWrt:/# ubus Usage: ubus [<options>] <command> [arguments...] Options:-s <socket>: Set the unix domain …

Rust 學習筆記:自定義構建和發布配置

Rust 學習筆記&#xff1a;自定義構建和發布配置 Rust 學習筆記&#xff1a;自定義構建和發布配置發布配置文件自定義 profile 的選項 Rust 學習筆記&#xff1a;自定義構建和發布配置 發布配置文件 在 Rust 中&#xff0c;發布配置文件是預定義的和可定制的概要文件&#xf…

優化 Transformer 模型:基于知識蒸餾、量化技術及 ONNX

Transformer 模型非常強大&#xff0c;但往往太大太慢&#xff0c;不適合實時應用。為了解決這個問題&#xff0c;我們來看看三種關鍵的優化技術&#xff1a;知識蒸餾、量化和ONNX 圖優化。這些技術可以顯著減少推理時間和內存使用。 為了說明每種技術的利弊&#xff0c;我們以…

Vue3中Axios的使用-附完整代碼

前言 首先介紹一下什么是axios Axios 是一個基于 promise 網絡請求庫&#xff0c;作用于node.js 和瀏覽器中。 它是 isomorphic 的(即同一套代碼可以運行在瀏覽器和node.js中)。在服務端它使用原生 node.js http 模塊, 而在客戶端 (瀏覽端) 則使用 XMLHttpRequests 官方網站…

@Pushgateway自定義腳本推送數據

文章目錄 Pushgateway 自定義腳本推送數據1. 目的2. 適用范圍3. 前提條件4. 操作流程4.1 確定指標類型和格式4.2 編寫推送腳本方法一:使用 curl 命令行推送方法二:使用 Python 腳本推送方法三:使用 Python 客戶端庫推送4.3 設置定時任務4.4 驗證數據5. 高級配置5.1 使用基本…

Git 使用規范指南

Learn Git Branching 1Git 基礎使用流程 1.1初始化與克隆 # 初始化本地倉庫 git init# 克隆遠程倉庫 git clone <repo_url> 一般拉取代碼&#xff0c;直接在文件夾界面打開bash&#xff0c;git clone就行了 1.2日常開發流程 1拉取最新代碼 git pull origin <branc…