【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;满足储能…