uni-app 如何實現選擇和上傳非圖像、視頻文件?

在 uni-app 中實現選擇和上傳非圖像、視頻文件,可根據不同端(App、H5、小程序)的特點,采用以下方法:

一、通用思路(多端適配優先推薦)

借助 uni.chooseFile 選擇文件,再用 uni.uploadFile 上傳,不過部分端有差異,需針對性處理:

1. 選擇文件(uni.chooseFile
uni.chooseFile({count: 1, // 可選擇文件數量,按需調整type: 'file', // 選擇任意類型文件,若想限制類型,可結合 extension 篩選success: (res) => {const tempFilePath = res.tempFiles[0].path; // 獲取選中文件的臨時路徑// 后續可執行上傳等操作},fail: (err) => {console.error('選擇文件失敗:', err);}
});
  • 參數說明
    • count:控制最多選幾個文件,按需設值。
    • type:設為 'file' 可選擇非媒體文件;若想限定特定類型(如文檔),可搭配 extension(H5 端支持 ),例 extension: ['.pdf', '.docx'] ,不過 App 和小程序端對 extension 支持度欠佳,復雜類型篩選可結合后續服務端校驗。
    • 選中后,res.tempFiles 里存文件信息,含臨時路徑 path 、文件名 name 、大小 size 等 。
2. 上傳文件(uni.uploadFile

拿到選擇的文件臨時路徑后,用 uni.uploadFile 上傳到服務器:

uni.uploadFile({url: 'https://your-server.com/upload', // 實際的服務端文件上傳接口filePaths: [tempFilePath], // 前面選擇文件得到的臨時路徑name: 'file', // 與服務端約定的接收文件的字段名formData: {// 可附帶其他業務參數,如用戶 ID、文件分類等userId: '123',category: 'document'},success: (uploadRes) => {const data = JSON.parse(uploadRes.data);console.log('上傳成功,服務端返回:', data);// 可依據服務端返回做后續處理,如更新文件列表、提示用戶等},fail: (err) => {console.error('上傳失敗:', err);}
});
  • 注意事項
    • url 要替換成真實的服務端上傳接口地址,需服務端配合實現文件接收邏輯(如 Node.js + Express 用 multer 中間件、Java 用 Spring Boot 的文件上傳解析等 )。
    • name 字段要和服務端接口約定一致,否則服務端無法正確識別文件。
    • 若需更靈活的請求頭設置、進度監聽等,可結合 uni.request 自己構建上傳邏輯(把文件轉成二進制流等方式 ),不過 uni.uploadFile 已封裝常見場景,優先推薦。

二、App 端特殊處理(解決兼容性問題)

uni.chooseFile 在 App 端選非媒體文件有兼容性問題(如部分安卓機型選特定文件失敗 ),可借助 5+App 的 plus.io.chooseFile 實現:

1. 選擇文件(plus.io.chooseFile
// 僅 App 端有效,需判斷平臺后使用
if (uni.getSystemInfoSync().platform === 'android' || uni.getSystemInfoSync().platform === 'ios') {plus.io.chooseFile({title: '選擇文件', // 選擇文件的標題提示filter: '*', // 篩選文件類型,* 表示所有,也可設 '.pdf,.docx' 等multiple: false // 是否多選},(res) => {const fileInfo = res.files[0]; // 獲取選中的文件信息const localPath = fileInfo.path; // 文件本地路徑// 可通過 plus.io 進一步操作文件,如讀取內容、轉成可上傳的格式// 示例:轉成臨時文件路徑,用于 uni.uploadFileconst tempFilePath = plus.io.convertLocalFileSystemURL(localPath); // 執行上傳等操作},(err) => {console.error('選擇文件失敗:', err);});
}
  • 優勢:對 App 端文件系統兼容性更好,能處理一些 uni.chooseFile 覆蓋不到的特殊文件選擇場景(如安卓分區存儲下的文件 )。
  • 不足:是 5+App 專有 API,H5 和小程序端無法使用,需做平臺判斷,增加代碼復雜度。
2. 上傳文件

拿到文件路徑后,同樣可用 uni.uploadFile 上傳,若遇到文件格式不兼容問題(如服務端需特定二進制流 ),可先用 plus.io 讀取文件內容轉成合適格式再上傳:

plus.io.resolveLocalFileSystemURL(localPath, (entry) => {entry.file((file) => {const fileReader = new plus.io.FileReader();fileReader.onloadend = (e) => {const buffer = e.target.result; // 文件內容的 Buffer 數據// 若服務端需要 FormData 格式,可構造后用 uni.request 上傳const formData = new FormData();formData.append('file', new Blob([buffer]), file.name); uni.request({url: 'https://your-server.com/upload',method: 'POST',header: {'Content-Type': 'multipart/form-data'},data: formData,success: (res) => {console.log('上傳成功:', res.data);}});};fileReader.readAsArrayBuffer(file);});
});

三、H5 端補充(利用瀏覽器特性)

H5 端除了用 uni.chooseFile ,還可直接用 HTML 原生的 <input type="file"> 實現更靈活的文件選擇(若 uni.chooseFile 樣式、功能滿足不了需求時 ):

1. 在頁面中添加 input 元素(可通過條件編譯僅在 H5 端顯示 )
<template><view><!-- #ifdef H5 --><input type="file" style="display: none;" ref="fileInput" @change="handleFileChange" /><button @click="openFileSelector">選擇文件</button><!-- #endif --></view>
</template><script>
export default {methods: {openFileSelector() {this.$refs.fileInput.click(); // 觸發文件選擇框},handleFileChange(e) {const file = e.target.files[0]; // 獲取選中的文件const fileReader = new FileReader();fileReader.onload = (event) => {const fileContent = event.target.result; // 文件內容,可轉成 Base64 等// 若要上傳,可構造 FormData 用 uni.request 或 axios 等上傳const formData = new FormData();formData.append('file', file);uni.request({url: 'https://your-server.com/upload',method: 'POST',header: {'Content-Type': 'multipart/form-data'},data: formData,success: (res) => {console.log('上傳成功:', res.data);}});};fileReader.readAsArrayBuffer(file);}}
}
</script>
  • 特點:完全基于瀏覽器原生能力,自定義程度高,可靈活控制文件選擇后的處理流程(如讀取文件內容預覽、做加密等 ),但需自己處理多端兼容(僅 H5 端能用 ),且樣式需自己調整。

四、小程序端限制與適配

小程序端 uni.chooseFile 本質是調用各小程序平臺的文件選擇 API,整體流程和前面通用方法一致,但有以下限制:

  • 文件類型與大小:不同小程序平臺對可選擇的文件類型、大小有約束(如微信小程序限制單文件最大 100MB 等 ),需在開發時注意。
  • 接口能力uni.uploadFile 需配置合法域名,且服務端要做相應跨域等配置,否則無法上傳成功。

五、方案推薦與總結

  • 優先推薦:用 uni.chooseFile + uni.uploadFile 的通用方案,多端兼容性較好,能覆蓋大部分場景(如上傳文檔、壓縮包等非媒體文件 ),簡單易實現。
  • App 端特殊場景:若通用方案有兼容性問題(如選文件失敗 ),補充 plus.io.chooseFile 的方式,增強對 App 端文件系統的適配。
  • H5 端自定義需求:結合原生 <input type="file"> 實現更靈活的文件選擇和預處理邏輯。

實際開發中,建議先嘗試通用方案,遇到特定端問題(如 App 端選某些文件報錯、H5 端樣式不滿意 ),再針對性用對應補充方案解決,同時注意服務端配合做好文件接收、校驗邏輯 。

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

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

相關文章

正點原子[第三期]Arm(iMX6U)Linux移植學習筆記-12.1 Linux內核啟動流程簡介

前言&#xff1a; 本文是根據嗶哩嗶哩網站上“Arm(iMX6U)Linux系統移植和根文件系統構鍵篇”視頻的學習筆記&#xff0c;在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了正點原子教學視頻和鏈接中的內容。 引用&#xff1a; …

UDP與TCP通信協議技術解析

文章目錄 協議基礎原理TCP&#xff1a;可靠的面向連接通信UDP&#xff1a;高效的無連接通信 性能特征分析TCP性能表現UDP性能表現 應用場景分析TCP適用場景UDP適用場景 技術實現考量錯誤處理策略網絡資源利用 選擇決策框架可靠性需求評估性能要求分析 混合方案設計協議組合策略…

mysql 頁的理解和實際分析

目錄 頁&#xff08;Page&#xff09;是 Innodb 存儲引擎用于管理數據的最小磁盤單位B樹的一般高度記錄在頁中的存儲 innodb ibd文件innodb 頁類型分析ibd文件查看數據表的行格式查看ibd文件 分析 ibd的第4個頁&#xff1a;B-tree Node類型先分析File Header(38字節-描述頁信息…

【優選算法】C++滑動窗口

1、長度最小的子數組 思路&#xff1a; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 滑動窗口// 1.left0,right0// 2.進窗口( nums[right])// 3.判斷// 出窗口// (4.更新結果)// 總和大于等于 target 的長度最小的 子數組…

ffmpeg(四):濾鏡命令

FFmpeg 的濾鏡命令是用于音視頻處理中的強大工具&#xff0c;可以完成剪裁、縮放、加水印、調色、合成、旋轉、模糊、疊加字幕等復雜的操作。其核心語法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "濾鏡參數" output.mp4或者帶音頻濾鏡&#xff1a; ffmpeg…

408考研逐題詳解:2009年第33題

2009年第33題 在 OSI 參考模型中&#xff0c;自下而上第一個提供端到端服務的層次是&#xff08; &#xff09; A. 數據鏈路層 \qquad B. 傳輸層 \qquad C. 會話層 \qquad D.應用層 解析 本題主要考查 OSI 參考模型各層的核心功能、端到端服務的定義。 OSI 參考模型&am…

CentOS 7.9安裝Nginx1.24.0時報 checking for LuaJIT 2.x ... not found

Nginx1.24編譯時&#xff0c;報LuaJIT2.x錯誤&#xff0c; configuring additional modules adding module in /www/server/nginx/src/ngx_devel_kit ngx_devel_kit was configured adding module in /www/server/nginx/src/lua_nginx_module checking for LuaJIT 2.x ... not…

自制喜悅字貼

一、想法 據說&#xff0c;把“喜悅”兩個字掛在家里顯眼的地方&#xff0c;時常看到&#xff0c;就能心情愉悅。剛好最近在學習前端flex布局&#xff0c;用代碼實現&#xff0c;導出圖片&#xff0c;打印出來&#xff0c;帖在家里&#xff0c;非常nice。現在分享給大家。 二…

每日八股文6.3

每日八股-6.3 Mysql1.COUNT 作用于主鍵列和非主鍵列時&#xff0c;結果會有不同嗎&#xff1f;2.MySQL 中的內連接&#xff08;INNER JOIN&#xff09;和外連接&#xff08;OUTER JOIN&#xff09;有什么主要的區別&#xff1f;3.能詳細描述一下 MySQL 執行一條查詢 SQL 語句的…

量化面試綠皮書:6. 燒繩子計時

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 6. 燒繩子計時 你有兩根繩子&#xff0c;每根繩子燃燒需要1小時。但是任何一根繩子在不同點都有不同的密度&#xff0c;所以不能保證繩子內不…

2-深度學習挖短線股1

選短線個股的流程 &#xff08;1&#xff09;數據預處理&#xff0c;根據短線個股篩選標準&#xff0c;給個股日線數據打標。 &#xff08;2&#xff09;模型訓練&#xff0c;針對每只股票&#xff0c;訓練得到分類模型。 &#xff08;3&#xff09;結果預測&#xff0c;根據訓…

【數據分析】探索嬰兒年齡變化對微生物群落(呼吸道病毒和細菌病原體)結構的影響

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹1. 混合效應邏輯回歸模型2. 隨機森林模型3. Maaslin2 分析加載R包數據下載導入數據數據預處理混合效應邏輯回歸模型分析微生物群落結構隨年齡的變化隨機森林模型預測病原體定植Maas…

實戰:子組件獲取父組件訂單信息

最佳實踐建議 優先使用 props&#xff1a;適合父子組件直接通信&#xff0c;數據流向清晰復雜場景用 eventBus&#xff1a;跨組件通信推薦使用 mitt 庫避免過度使用 $parent&#xff1a;會導致組件耦合度高&#xff0c;難以維護provide/inject 適用于跨層級&#xff1a;如主題…

Spring Security深度解析:構建企業級安全框架

Spring Security深度解析:構建企業級安全框架 本文將深入探討Spring Security安全框架的核心原理、架構設計和實際應用,幫助開發者全面掌握企業級應用安全防護技術。 目錄 Spring Security概述核心架構與原理認證機制詳解授權機制詳解核心組件分析配置與集成高級特性應用安全…

計算矩陣A和B的乘積

根據矩陣乘法規則&#xff0c;編程計算矩陣的乘積。函數fix_prod_ele()是基本方法編寫&#xff0c;函數fix_prod_opt()是優化方法編寫。 程序代碼 #define N 3 #define M 4 typedef int fix_matrix1[N][M]; typedef int fix_matrix2[M][N]; int fix_prod_ele(f…

《Brief Bioinform》: 鼠腦單細胞與Stereo-seq數據整合算法評估

一、寫在前面 基因捕獲效率、分辨率一直是空間轉錄組細胞類型識別的攔路虎&#xff0c;許多算法能夠整合單細胞(single-cell, sc)或單細胞核(single-nuclear, sn)數據與空間轉錄組數據&#xff0c;從而幫助空轉數據的細胞類型注釋。此前我們介紹過近年新出爐的Stereo-seq平臺&…

camera功能真的那么難用嗎

背景 Android開發工作過程中&#xff0c;經常需要用到camera相關能力&#xff0c;比如&#xff1a;人臉識別&#xff0c;ai識別&#xff0c;拍照預覽&#xff0c;攝像頭錄制等等需求。都需要使用到camera&#xff0c;且需要拿到camera的預覽數據。但是每次開發這塊代碼都比較繁…

USART 串口通信全解析:原理、結構與代碼實戰

文章目錄 USARTUSART簡介USART框圖USART基本結構數據幀起始位偵測數據采樣波特率發生器串口發送數據 主要代碼串口接收數據與發送數據主要代碼 USART USART簡介 一、USART 的全稱與基本定義 英文全稱 USART&#xff1a;Universal Synchronous Asynchronous Receiver Transmi…

LeetCode 152. 乘積最大子數組 - 動態規劃解法詳解

文章目錄 問題描述解題思路動態規劃狀態定義狀態轉移方程完整代碼實現復雜度分析示例解析關鍵點說明總結問題描述 給定一個整數數組 nums,請找出數組中乘積最大的連續子數組(該子數組中至少包含一個數字),并返回該子數組對應的乘積。 示例: 輸入: [2,3,-2,4] 輸出: 6 解…

Python: 操作 Excel折疊

??Python 操作 Excel 折疊(分組)功能詳解(openpyxl & xlsxwriter 雙方案) 在處理 Excel 報表或數據分析時,我們常常希望通過 折疊(分組)功能 來提升表格的可讀性和組織性。本文將詳細介紹如何使用 Python 中的兩個主流 Excel 操作庫 —— openpyxl 和 xlsxwriter …