【vue】Uniapp 打包Android 文件選擇上傳問題詳解~

需求

uniapp兼容android app,pc,h5的文件選擇并上傳功能。

需要支持拍照和相冊選擇,以及選擇其他類型文件上傳~

實踐過程和問題

開始使用uni-file-picker組件

以為很順利,android模擬器測試……

忽略了平臺兼容性提示~😭

Get:上傳圖片或拍照,使用uniapp自帶的uni.chooseImage即可……

還需要上傳非媒體問題(圖片、音頻、影片)。本以為uni.chooseFile就OK了~

But

提示

uniapp提示:Android端可以使用Native.js

  • App端如需選擇非媒體文件,可在插件市場搜索文件選擇,其中Android端可以使用Native.js,無需原生插件,而iOS端需要原生插件。
  • App端如果想選擇下載到_doc、_downloads、_documents等plus.io控制的目錄下的文件,可通過plus.io Api,自己做選擇框。

官方提示到此為止~

AI求解

于是,開始了漫長的AI問答……

deepseek、豆包、文心全問一遍~(其實內核是不是都deepseek🙂)

都”快速“給出答案代碼,然而”打包“測試已經沒反應;好一點的依舊只能選圖片~

舉一個栗子~

問:Android端使用Native.js進行選擇文件上傳

答:

1. 配置權限

manifest.json文件中配置文件讀取權限:


{"plus": {"permission": {"readExternalStorage": {"desc": "讀取設備外部存儲空間的文件","android": {"name": "android.permission.READ_EXTERNAL_STORAGE"}}}}
}

2. 編寫選擇文件的 Native.js 代碼

在頁面的<script>標簽內或單獨的 JS 文件中編寫選擇文件的邏輯:


function pickFile(callback) {const Intent = plus.android.importClass('android.content.Intent');const intent = new Intent(Intent.ACTION_GET_CONTENT);intent.addCategory(Intent.CATEGORY_OPENABLE);// 設置選擇所有類型文件intent.setType('*/*'); plus.android.startActivityForResult(intent, function (intentData) {if (intentData) {const uri = intentData.getData();const ContentResolver = plus.android.importClass('android.content.ContentResolver');const cursor = plus.android.invoke(plus.android.runtimeMainActivity, 'getContentResolver').query(uri, ['_data'], null, null, null);if (cursor.moveToFirst()) {const columnIndex = cursor.getColumnIndex('_data');const filePath = cursor.getString(columnIndex);cursor.close();callback(filePath);}}});
}

3. 編寫上傳文件的代碼

結合uni.uploadFile方法來上傳選擇的文件:

<template><view class="container"><button @click="pickAndUpload">選擇并上傳文件</button></view>
</template><script>
export default {methods: {pickAndUpload() {pickFile((filePath) => {if (filePath) {this.uploadFile(filePath);} else {uni.showToast({title: '未選擇文件',icon: 'none'});}});},uploadFile(filePath) {uni.uploadFile({url: 'https://your - server - url.com/api/upload', // 替換為實際的上傳接口地址filePath: filePath,name: 'file',success: function (res) {console.log('文件上傳成功', res.data);uni.showToast({title: '文件上傳成功',icon:'success'});},fail: function (err) {console.log('文件上傳失敗', err);uni.showToast({title: '文件上傳失敗',icon: 'none'});}});}}
};
</script><style scoped>
.container {padding: 20px;
}
</style>

很詳細~

然而只有一個問題:不work!

o(╯□╰)o

正確答案

最后還在uniapp的論壇上找到了答案,已經通過android app測試,可用~

使用原生的Native.js調用📱平臺的文件管理器,選擇文件并向上傳文件的相關方法傳遞所選文件的正確路徑。

如果會安卓原生編程,代碼so easy。

// from DCloud
window.PickFile = function(callback,acceptType){  function ip(obj){  plus.android.importClass(obj);  return obj;  }  if(plus.os.name == 'Android' && typeof callback == 'function'){  var CODE_REQUEST = 1000;  var context = plus.android.runtimeMainActivity();  ip(context);  var Intent = plus.android.importClass('android.content.Intent');  var intent = new Intent(Intent.ACTION_GET_CONTENT);  intent.addCategory(Intent.CATEGORY_OPENABLE);  if(acceptType){  intent.setType(acceptType);  }else{  intent.setType("*/*");  }  context.onActivityResult = function(requestCode,resultCode,intentData){  if(requestCode == CODE_REQUEST){  if(intentData){  var uriValue = intentData.getData();  plus.android.importClass(uriValue);  var scheme = uriValue.getScheme();  if(scheme == 'content'){//還需要進行數據庫查詢,一般圖片數據  var cursor = ip(context.getContentResolver()).query(uriValue,['_data'], null, null, null);  if(cursor){  ip(cursor).moveToFirst();  var columnIndex = cursor.getColumnIndex('_data');  picturePath = cursor.getString(columnIndex);  cursor.close();  callback(picturePath);//返回文件路徑  }  }else if(scheme == 'file'){  callback(uriValue.getPath());//返回文件路徑  }  }else{  callback(null);  }  }  }  context.startActivityForResult(intent,CODE_REQUEST);  }  
}

實現

為了h5還是先判斷下環境

const BaseInfo = uni.getAppBaseInfo();

BaseInfo.uniPlatform==="app”的話用,h5還是uni.chooseFile

function ip(obj){  plus.android.importClass(obj);  return obj;  }
uploadFileInit(){const CODE_REQUEST = 500;  let context = plus.android.runtimeMainActivity();  ip(context);  let Intent = plus.android.importClass('android.content.Intent');  let intent = new Intent(Intent.ACTION_GET_CONTENT);  intent.addCategory(Intent.CATEGORY_OPENABLE);  intent.setType("*/*");   context.onActivityResult = function(requestCode,resultCode,intentData){  if(requestCode == CODE_REQUEST){  if(intentData){  var uriValue = intentData.getData();  plus.android.importClass(uriValue);  var scheme = uriValue.getScheme();  if(scheme == 'content'){//還需要進行數據庫查詢,一般圖片數據  var cursor = ip(context.getContentResolver()).query(uriValue,['_data'], null, null, null);  if(cursor){  ip(cursor).moveToFirst();  var columnIndex = cursor.getColumnIndexOrThrow('_data');  try{var filePath = cursor.getString(columnIndex);  _this.filePath = filePath;cursor.close();//  _this.調用上傳接口的方法(filePath, ‘文件類型’);}catch(e){}}  }else if(scheme == 'file'){  // 路徑 uriValue.getPath()}  }else{  uni.showToast({title: '選擇文件失敗',icon: 'none'});}  }  }  context.startActivityForResult(intent,CODE_REQUEST);  
}

找了好久~真機測試可行~

吐槽

uniapp這個是個坑,明明很多文件選擇插件,都不兼容~

官方會推薦兼容的插件——當然:收費~

其他實現方式推薦

曲線救國:web-view

在 web-view 組件內可以使用 input 元素進行選擇,使用表單或者 xhr 上傳;

在插件市場搜索:全文件上傳選擇非原生

全文件上傳選擇非原生2.0版 - DCloud 插件市場

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

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

相關文章

Python:操作 Excel 格式化

??Python 操作 Excel 格式化完整指南(openpyxl 與 xlsxwriter 雙方案) 在數據處理和報表自動化中,Python 是一把利器,尤其是配合 Excel 文件的讀寫與格式化處理。本篇將詳細介紹兩大主流庫: openpyxl:適合讀取與修改現有 Excel 文件xlsxwriter:適合創建新文件并進行復…

Prompt Enginering(提示工程)先進技術

前沿 CoT&#xff08;Chain-of-Thought&#xff09;和 ReACT&#xff08;Reasoning and Acting&#xff09;是兩種先進的 Prompt Engineering&#xff08;提示工程&#xff09; 技術&#xff0c;旨在提升大語言模型&#xff08;LLM&#xff09;的推理、規劃和執行能力。 CoT&a…

【C++系列】模板類型特例化

1. C模板類型特例化介紹 ??定義??&#xff1a;模板類型特例化&#xff08;Template Specialization&#xff09;是C中為模板的特定類型提供定制實現的機制&#xff0c;允許開發者對通用模板無法處理的特殊類型進行優化或特殊處理。 ??產生標準??&#xff1a; C98/03…

AI數據分析在體育中的應用:技術與實踐

在現代體育競技領域&#xff0c;"數據驅動"已不再是一個遙遠的概念。尤其隨著人工智能&#xff08;AI&#xff09;和大數據分析的不斷成熟&#xff0c;從職業俱樂部到賽事直播平臺&#xff0c;從運動員訓練到球迷觀賽體驗&#xff0c;AI正以前所未有的方式滲透并改變…

計數思想-眾數

11203-眾數 題目描述(Description) 眾數是指在一組數據中&#xff0c;出現次數最多的數。例如&#xff1a;1, 1, 3 中出現次數最多的數為 1&#xff0c;則眾數為 1。 給定一組數&#xff0c;你能求出眾數嗎&#xff1f; 輸入格式(Format Input) 第 1 行輸入一個整數 n (1 &…

【Go語言基礎【20】】Go的包與工程

文章目錄 零、概述一、包基礎1、包的核心作用2、包的聲明與結構2.1、 包聲明&#xff08;Package Declaration&#xff09;2.2、 包的目錄結構&#xff08;工程視角&#xff09; 3、包的導入與調用3.1、導入包&#xff08;Import Packages&#xff09;3.2、 調用包成員3.3、 導…

《C++初階之入門基礎》【命名空間 + 輸入輸出 + 缺省參數 + 函數重載】

【命名空間 輸入&輸出 缺省參數 函數重載】目錄 前言&#xff1a;---------------hello world---------------比較C語言和C的第一個程序&#xff1a;hello word ---------------命名空間---------------什么是命名空間&#xff1f;怎么使用命名空間&#xff1f;怎么定義…

java綜合項目開發一課一得

文章目錄 Java 綜合項目課程學習&#xff1a;探索與成長之路一、課程初體驗&#xff1a;從理論走向實踐&#xff08;一&#xff09;系統學習 Java 核心理論知識&#xff08;二&#xff09;開啟首個實踐項目 —— 圖書管理系統 二、項目攻堅&#xff1a;挑戰與突破&#xff08;一…

JuiceFS v1.3-Beta2:集成 Apache Ranger,實現更精細化的權限控制

在大數據場景中&#xff0c;文件系統和應用組件的權限管理至關重要。在最新發布的 JuiceFS 社區版 v1.3-Beta 2 中&#xff0c;JuiceFS 引入了與 Apache Ranger 的集成&#xff0c;提供了更為靈活和細粒度的權限控制解決方案。 本文將介紹 JuiceFS 社區版如何與 Apache Ranger…

6月8日day48打卡

隨機函數與廣播機制 知識點回顧&#xff1a; 隨機張量的生成&#xff1a;torch.randn函數卷積和池化的計算公式&#xff08;可以不掌握&#xff0c;會自動計算的&#xff09;pytorch的廣播機制&#xff1a;加法和乘法的廣播機制 ps&#xff1a;numpy運算也有類似的廣播機制&…

計算機常用快捷鍵分類匯總,涵蓋 Windows、macOS 以及通用軟件場景

一、系統通用快捷鍵 功能Windows 快捷鍵macOS 快捷鍵復制Ctrl CCommand C粘貼Ctrl VCommand V剪切Ctrl XCommand X撤銷Ctrl ZCommand Z全選Ctrl ACommand A保存Ctrl SCommand S打印Ctrl PCommand P新建窗口/標簽頁Ctrl NCommand N關閉當前窗口/標簽頁Ctrl WC…

ES6中的Map與Set數據結構的簡單應用

一、Map定義和基本用法 Map是一種鍵值對集合&#xff0c;其中鍵和值都可以是任何類型&#xff08;對象、原始值等&#xff09;。與普通對象不同&#xff0c;Map保持鍵值對的插入順序&#xff0c;并且允許使用任何類型的鍵。 1、創建Map const map new Map()2、添加鍵值對。…

25.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--用戶服務接口

用戶管理是任何系統的基礎功能之一&#xff0c;本篇介紹了如何實現一個完整的用戶管理模塊&#xff0c;包括用戶信息的增刪改查、用戶狀態管理、分頁查詢、數據驗證和權限控制。核心代碼實現部分涵蓋了控制器&#xff08;UserController&#xff09;、服務接口&#xff08;IUse…

基于深度學習的無人機軌跡預測

完整代碼見文末 隨著無人機技術的不斷發展,無人機在農業、物流、監控等領域的應用日益廣泛。精準的軌跡預測不僅能夠提高無人機飛行的效率和安全性,還能在應對復雜環境下的突發狀況時做出迅速反應。因此,基于深度學習的無人機軌跡預測已成為當前研究和應用的熱門方向。 無…

AUTOSAR實戰教程--DoIP_02_診斷鏈路建立流程

第一步&#xff1a;DoIP實體車輛聲明/診斷儀車輛識別請求 打開激活線以后&#xff0c;DoIP實體發的三幀車輛聲明報文。其中包含了DoIP實體的診斷邏輯地址&#xff08;可以類比DoCAN的物理請求/響應地址&#xff09;&#xff0c;對應車輛的VIN碼&#xff08;若已配置&#xff0…

跟我學c++中級篇——多線程中的文件處理

一、文件處理 作為IO處理的一種重要場景&#xff0c;文件處理是幾乎所有編程都無法繞過的一個情況。稍微復雜的一些的程序都可能需要文件處理&#xff0c;不管這種文件處理對開發者來說是顯式的還是隱式的。相對于其它語言&#xff0c;C并未提供多么好的文件處理API接口&#…

Flutter知識點匯總

Flutter架構解析 1. Flutter 是什么?它與其他移動開發框架有什么不同? Flutter 是 Google 開發的開源移動應用開發框架,可用于快速構建高性能、高保真的移動應用(iOS 和 Android),也支持 Web、桌面和嵌入式設備。。它與其他移動開發框架(如 React Native、Xamarin、原…

【會員專享數據】1980—2022年中國逐日月年潛在蒸散發柵格數據

氣象數據是我們在各項研究中都經常使用的數據&#xff0c;尤其是高精度的氣象數據應用價值非常高。 之前我們分享過研究者張凌, 胡英屹等發布在國家冰川凍土沙漠科學數據中心平臺上的nc格式的1980—2022年中國高分辨率逐日、逐月、逐年氣象數據&#xff01;很多小伙伴拿到數據…

前端打包工具簡單介紹

前端打包工具簡單介紹 一、Webpack 架構與插件機制 1. Webpack 架構核心組成 Entry&#xff08;入口&#xff09; 指定應用的起點文件&#xff0c;比如 src/index.js。 Module&#xff08;模塊&#xff09; Webpack 把項目當作模塊圖&#xff0c;模塊可以是 JS、CSS、圖片等…

工業控制核心引擎高性能MCU——MM32F5370

RAMSUN提供的MM32F5370搭載180MHz Arm China Star-MC1處理器&#xff0c;集成DSP、FPU與三角函數加速單元&#xff08;CORDIC&#xff09;&#xff0c;輕松應對復雜算法需求。其技術亮點包括&#xff1a; 超高精度PWM&#xff1a;8通道208ps級高精度PWM輸出&#xff0c;滿足儲能…