taro小程序如何實現大文件(視頻、圖片)后臺下載功能?

一、需求背景

1、需要實現小程序下載最大500M視頻
2、同時需支持圖片下載
3、退到其他頁面再次回到當前頁面時,下載進度也需要展示

二、實現步驟

1、在app.ts文件定義一個全局變量globalDownLoadData
在這里插入圖片描述
2、寫一個獨立的下載hooks,代碼如下(hooks/useDownLoad.ts文件)

import Taro, { useDidShow } from '@tarojs/taro';
import { useState, useCallback, useEffect, useRef } from 'react';
import { tips } from '@/modules/utils/log';
import { GET_ENV } from '@/modules/core/env';// 下載選項接口
interface DownloadOptions {/** 下載文件的URL */url: string;// 下載的是圖片還是視頻,默認是視頻isImg?: boolean;// 下載成功后的回調successFn?: () => void;
}// 請注意_taskId格式應該為:`material_${routerParams.id}`
// material為頁面標志,請注意唯一性,避免不同頁面的id重復
export const useDownLoad = _taskId => {const taskId = `${GET_ENV()}_${_taskId}`;const globalDownLoadData = useRef(Taro.getApp().globalDownLoadData);const [progress, setProgress] = useState(0);useDidShow(() => {// 恢復目標頁面下載進度setProgress(globalDownLoadData.current[taskId]?.progress || 0);});useEffect(() => {globalDownLoadData.current[taskId] = {progress,downloadTask: globalDownLoadData.current[taskId]?.downloadTask};}, [progress]);// 賦值數據給全局useEffect(() => {Taro.getApp().globalDownLoadData = globalDownLoadData.current;}, [globalDownLoadData]);useEffect(() => {// 再次進入頁面時,將監聽加上addProgressUpdate();}, []);/*** 執行文件下載* @param options 下載選項*/const downloadFn = useCallback(async (options: DownloadOptions) => {try {setProgress(0);// 創建下載任務globalDownLoadData.current[taskId].downloadTask = Taro.downloadFile({url: options.url,success: async res => {if (res.statusCode === 200) {// 下載成功,保存到相冊Taro.getSetting({success(settingRes) {// 是否相冊授權,已授權直接保存圖片if (settingRes.authSetting['scope.writePhotosAlbum']) {const Api = options.isImg ? 'saveImageToPhotosAlbum' : 'saveVideoToPhotosAlbum';Taro[Api]({filePath: res.tempFilePath,success() {tips('下載完成');options.successFn?.();// 下載完成后清除進度setProgress(0);},fail(err) {console.log('saveImageToPhotosAlbum err', err);setProgress(0);}});// 未授權,則先授權} else {Taro.authorize({scope: 'scope.writePhotosAlbum',fail() {tips('下載失敗,請先點擊右上角獲取授權');setProgress(0);}});}},fail(err) {setProgress(0);tips('下載失敗,請稍后再試');console.log('getSetting err', err);}});} else {// 下載失敗setProgress(0);tips('下載失敗,請稍后再試');console.log('downloadFile下載出錯了:', res);}},fail: error => {// 下載出錯setProgress(0);globalDownLoadData.current[taskId] = {progress: 0,downloadTask: null};console.log('下載出錯了:', error);Taro.showModal({title: '下載異常',content: '下載異常或文件大小超過小程序限制,請通過瀏覽器下載!',confirmColor: '#3f57ff',success: modalRes => {if (modalRes.confirm) {Taro.setClipboardData({data: options.url,success() {tips('資源鏈接已復制');}});}}});}});addProgressUpdate();} catch (error) {// 捕獲其他異常tips('下載失敗,請稍后再試');console.log('downloadFn下載失敗======>', error);setProgress(0);}}, []);// 監聽下載進度變化const addProgressUpdate = () => {const downloadTask = globalDownLoadData.current[taskId]?.downloadTask;if (!downloadTask) {setProgress(0);return;}downloadTask.onProgressUpdate(res => {if (res.progress >= 100) {// 下載完成時,延遲2秒后清除進度setTimeout(() => {setProgress(0);downloadTask.abort();delete globalDownLoadData.current[taskId];}, 2000);} else {setProgress(res.progress);}});};return {downloadFn,progress};
};

3、頁面使用

import { useDownLoad } from '@/subPages/hooks/useDownLoad';const { downloadFn, progress } = useDownLoad(`material_${routerParams.id}`);const onDownload = () => {if (!curUrl) {tips('下載資源不存在');return;}Taro.showModal({title: '提示',confirmColor: '#3f57ff',content: '確定要下載該素材嗎?',success: async res => {if (res.confirm) {downloadFn({url: curUrl,isImg: false});}}});};

四、參考文檔:

https://developers.weixin.qq.com/miniprogram/dev/api/network/download/wx.downloadFile.html
https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.saveImageToPhotosAlbum.html
https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.saveVideoToPhotosAlbum.html

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

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

相關文章

BUUCTF——Online Tool

BUUCTF——Online Tool 進入靶場 <?phpif (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$_SERVER[REMOTE_ADDR] $_SERVER[HTTP_X_FORWARDED_FOR]; }if(!isset($_GET[host])) {highlight_file(__FILE__); } else {$host $_GET[host];$host escapeshellarg($host);$host e…

《解鎖CSS Flex布局:重塑現代網頁布局的底層邏輯》

網頁布局作為用戶體驗的基石&#xff0c;其重要性不言而喻。從早期簡單的表格布局&#xff0c;到后來基于浮動與定位的復雜嘗試&#xff0c;網頁布局技術始終在不斷演進。而CSS Flex布局的出現&#xff0c;宛如一顆璀璨的新星&#xff0c;徹底革新了網頁布局的設計理念與實踐方…

4.28-4.29 Vue

基于數據渲染出用戶看到的頁面。 常用指令&#xff1a; click單擊事件。 axios&#xff1a; 發出請求后&#xff0c;不會等待請求結束&#xff0c;而是繼續進行下面的代碼。

每日算法-250429

每日 LeetCode 題解 (2025-04-29) 大家好&#xff01;這是今天的 LeetCode 刷題記錄&#xff0c;主要涉及幾道可以使用貪心策略解決的問題。 2037. 使每位學生都有座位的最少移動次數 題目描述: 思路 貪心 解題過程 要使總移動次數最少&#xff0c;直觀的想法是讓每個學生…

yolov8+kalman 實現目標跟蹤統計人流量

簡述 最近接了畢業生的畢業設計題&#xff0c;想著幫幫忙&#xff0c;要使用機器視覺識別&#xff0c;追蹤和邏輯統計的方式來統計人流&#xff0c;要求是滿足下面特性 高精度&#xff1a;YOLOv8 提供高質量檢測&#xff0c;卡爾曼濾波平滑跟蹤。高效率&#xff1a;兩者結合滿…

Shopify網上商店GraphQL Admin接口查詢實戰

目錄 一、Shopify網上商店 二、個人商店配置接口權限 三、PostMan調用接口測試 四、通過Java服務調用接口 一、Shopify網上商店 Shopify是由Tobi Ltke創辦的加拿大電子商務軟件開發商&#xff0c;總部位于加拿大首都渥太華&#xff0c;已從一家在咖啡店辦公的 5人團隊&…

【Tips】高效文獻管理:Zotero 導入參考文獻的多種方式詳解

高效文獻管理&#xff1a;Zotero 導入參考文獻的多種方式詳解 在學術研究中&#xff0c;高效管理參考文獻是提升效率的關鍵。Zotero 作為一款強大的文獻管理工具&#xff0c;提供了多種便捷的文獻導入方式。以下結合文獻題錄完整性對比分析&#xff0c;為大家詳細介紹 Zotero …

[AI]browser-use + web-ui 大模型實現自動操作瀏覽器

[AI]browser-use web-ui 大模型實現自動操作瀏覽器 介紹 官方地址&#xff1a;https://github.com/browser-use/web-ui browser-use主要作用是將 AI Agent 與瀏覽器鏈接起來從而實現由 AI 驅動的瀏覽器自動化。今天會給大家介紹如何通過browser-use web-ui來搭建并操作browse…

Springboot請求靜態資源時,request.getServletPath() 返回error

大家好&#xff0c;我是 程序員碼遞夫。 SpringBoot請求靜態資源時&#xff0c;request.getServletPath() 返回error&#xff0c; 明明我的目錄文件是存在的怎么就報錯了呢&#xff1f; 如我請求 http://127.0.0.1:9090/Hanfu/upload/1647161536390.png 通常是因為請求的資…

在開發板上如何處理curl: (60) SSL certificate problem

目錄 引言 問題解析 解決方法 跳過證書驗證 采用證書認證 結語 引言 最近一直推薦學生們在課程實驗中使用curl及其libcurl。curl 是一個強大的命令行工具&#xff0c;用于在命令行中進行數據傳輸。它支持多種協議&#xff0c;如 HTTP、HTTPS、FTP、FTPS、SCP、SFTP 等。…

CSRF請求偽造

該漏洞主要是關乎于用戶&#xff0c;告誡用戶不可亂點擊鏈接&#xff0c;提升自我防范&#xff0c;才能不落入Hacker布置的陷阱&#xff01; 1. cookie與session 簡單理解一下兩者作用 1.1. &#x1f36a; Cookie&#xff1a;就像超市的會員卡 存儲位置&#xff1a;你錢包里…

Python循環與遍歷詳解:從入門到進階

在Python編程中&#xff0c;循環和遍歷是最基礎但極其重要的知識點。理解并掌握這部分內容&#xff0c;是編寫高效、清晰代碼的前提。本文將從for循環和while循環的基本語法出發&#xff0c;逐步深入探討range、enumerate、zip、列表推導式、字典遍歷等Python中常見的遍歷技巧&…

Python-MCPServer開發

Python-MCPServer開發 使用FastMCP開發【SSE模式的MCPServer】&#xff0c;熟悉【McpServer編碼過程】【McpServer調試方法】 1-核心知識點 1-熟悉【SSE模式的MCPServer】開發2-熟悉【stdio模式的MCPServer】開發3-熟悉【啟動MCPServer】的三種方式 3.1-直接啟動:python mcp_s…

高級項目管理

在信息系統項目管理工作中&#xff0c;組織管理者和項目管理者&#xff0c;有時還會面臨多項目的管理&#xff0c;或組織級的項目管理、項目的量化管理等課題。 其中&#xff0c;項目集管理、項目組合管理和組織級項目管理&#xff0c;為多項目管理和組織級管理提供有效指導&a…

tarjan縮點+強聯通分量

【模板】縮點https://www.luogu.com.cn/problem/P3387 首先我們要理解這道題為什么要用縮點 題目說的是有向圖&#xff0c;如果無環的話就可以用DP來解決了 由于可以走重復的點&#xff0c;所以一個環上的點可以看成是一個點&#xff0c;它的點權就等于該環上所有點的點權之…

OSCP:獲取全交互式 Windows 反向 Shell

簡介 在本文中&#xff0c;我們將探討獲取完全交互式 Windows 反向 Shell 的各種方法&#xff0c;從利用內置工具到采用先進技術以獲得更好的控制和功能。 通過 Invoke-ConPtyShell 我獲取完全交互式 Windows 反向 Shell 的首選方法是通過 Invoke-ConPtyShell 腳本。當 Wind…

免費超好用的電腦操控局域網內的手機(多臺,無線)

使用 第一步 解壓QtScrcpy壓縮包&#xff0c;并運行QtScrcpy.exe 第二步 2.1 手機開啟開發者模式&#xff08;設置>關于本機>版本信息>連點10下“版本號”&#xff09; 2.2 開啟 USB調試 和 無線調試&#xff08;設置>開發者選項> USB調試 無線調試&#xf…

Go語言內存管理

本章節&#xff0c;就來學習一下go語言的內存模型&#xff0c;看一下內存的分配&#xff0c;存儲都是如何實現的&#xff0c;與此同時&#xff0c;在正式開始今天的主題之前&#xff0c;首先先來學習操作系統基于這一方面的內容&#xff0c;來看看是如何管理內存的吧 本章及節…

【docker】啟動臨時MongoDB容器、掛載數據卷運行數據庫服務,并通過備份文件恢復MongoDB數據庫備份數據

?啟動臨時 MongoDB 容器、掛載數據卷運行數據庫服務&#xff0c;并通過備份文件恢復數據 1.命令分解與功能說明1.1.啟動一個臨時 MongoDB 容器?&#xff0c;并進入交互式終端&#xff08;1&#xff09;執行命令&#xff08;2&#xff09;實現功能?&#xff08;3&#xff09;…

【最新 MCP 戰神手冊 08】工具使用詳解:實現 AI 行動

文章目錄 1. 開始啦!2. 第一部分:設計高效且安全的工具3. 第二部分:定義工具藍圖——參數、輸出與約束條件4. 第三部分:彌合差距:LLM 兼容性(函數調用)5. 第四部分:實施與測試的最佳實踐1. 開始啦! 在前幾章中,我們將工具介紹為 AI 模型在 MCP 客戶端引導下向 MCP 服…