当前位置: 首页 > news >正文

UniApp 在手机端(Android)打开选择文件和文件写入

<!-- 文件选择组件 -->
<template><view><view @click="handleSelectFile"> <!-- 指定一个默认插槽sss --><slot>选择文件</slot></view><view id="fileSelectContainer" :prop="fileProps" :change:prop="fileSelectModule.updateFileProps" r-entry /></view>
</template>
<!-- 逻辑层 -->
<script>export default {name: "FileSelect",components: {},data() {return {fileProps: {acceptTypes: '.xls,.xlsx',selectFileTrigger: false,fileStrType: 'Base64' //Base64、String}}},onLoad() {},methods: {handleUniSelectFile() {uni.chooseImage({count: 6, //默认9sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有sourceType: ['album'], //从相册选择success: function(res) {console.log("uni.chooseImage", res);console.log(JSON.stringify(res.tempFilePaths));}});},updataSelectFileTrigger(selectFileTrigger) {this.fileProps.selectFileTrigger = selectFileTrigger},handleSelectFile() { //选择文件按钮//通过属性改变,配合模块的:change:prop=触发视图层的事件this.fileProps.selectFileTrigger = true;},// 处理文件选择回调handleFileSelected(files) {this.$emit("fileChange", files)},}}
</script>
<!--视图层:使用 RenderJS模块方式进行APP上非图片和视频选择 -->
<script module="fileSelectModule" lang="renderjs">export default {data() {return {fileInputId: "select-file-input",fileInput: null,fileStrType: null //Base64、String};},mounted() {this.createFileInput(); // 动态创建文件输入元素console.log('FileSelectModule已挂载');},methods: {createFileInput() { // 创建文件输入元素const existingInput = document.getElementById(this.fileInputId);if (existingInput) { // 移除已存在的input元素existingInput.remove();}// 创建新的文件输入元素this.fileInput = document.createElement('input');this.fileInput.id = this.fileInputId;this.fileInput.type = 'file';this.fileInput.style.display = 'none';// 添加文件选择事件监听this.fileInput.addEventListener('change',(event) => {this.handleFileChange(event);});document.body.appendChild(this.fileInput);},handleFileChange(event) { // 文件选择文成const files = event.target.files;if (!files) return;let promiseArr = []for (let file of files) {promiseArr.push(this.fileToBase64OrStr(file))}Promise.all(promiseArr).then(values => {let tempFilePaths = [];let tempFiles = []for (let fileInfo of values) {tempFilePaths.push(fileInfo.path)tempFiles.push(fileInfo)}let result = {tempFilePaths,tempFiles}this.$ownerInstance.callMethod('handleFileSelected', result);}).catch(err => {console.log(err);})},triggerFileInput() { // 触发文件输入点击if (this.fileInput) {this.fileInput.click(); //触发点击事件,进行文件选择this.$ownerInstance.callMethod("updataSelectFileTrigger", false) //重置文件选择标识方便下次进行选择}},updateFileProps(newValue, oldValue) { // 更新文件属性if (newValue && newValue.selectFileTrigger) { // 监听文件选择触发信号this.fileStrType = newValue.fileStrType || "String"this.triggerFileInput();}},fileToBase64OrStr(file) { //将文件转场base64return new Promise((resolve, reject) => {const reader = new FileReader()reader.onloadend = () => { //文件读取操作完成时的回调函数const base64String = reader.resultlet result = {path: base64String,size: file.size,name: file.name, //这个属性uni.chooseImage中没有type: file.type //这个属性uni.chooseImage中没有}resolve(result)}reader.onerror = (e) => {reject(3)}//Base64、Stringif ("Base64" === this.fileStrType) {reader.readAsDataURL(file) //以URL编码(Base64编码)格式读取文件数据内容} else {reader.readAsText(file) //以文本格式读取文件数据内容}})}}};
</script>
<style>
</style>

打开文件选择框截图

http://www.dtcms.com/a/540024.html

相关文章:

  • HarmonyOS分布式媒体播放器——跨设备音视频无缝流转
  • 【金融行业案例】基于Vaadin全栈Java框架重构内部系统,全面提升开发效率与用户体验
  • 小型网站开发要多少钱苏州专业做网站的公司哪家好
  • RocketMQ 生产环境性能调优实战:从 0 到 1 打造高可用消息队列系统
  • 脉冲按摩贴方案开发, 脉冲按摩贴MCU控制方案设计
  • 特别酷炫网站做网站有费用吗
  • DrissionPage 基于 Python 的网页自动化工具
  • Next.js vs Vue.js:2025年全栈战场,谁主沉浮?
  • DAY01笔记
  • 10-js基础(ESMAScript)
  • 一次深入排查:Spring Cloud Gateway TCP 连接复用导致 K8s 负载均衡失效
  • 基于 Vue3 及TypeScript 项目后的总结
  • Android下解决滑动冲突的常见思路是什么?
  • 建筑外观设计网站如何做一个门户网站
  • SQL多表查询完全指南-从JOIN到复杂关联的数据整合利器
  • Redis主从复制与哨兵集群
  • 电科金仓“异构多活架构”:破解浙江省人民医院集团化信创难题的密钥
  • 从零搭建群晖私有影音库:NasTool自动化追剧全流程拆解与远程访问协议优化实践
  • Maven项目管理:高效构建与依赖管理!
  • 【win11】funasr 1:配置conda环境
  • 2025年--Lc219-590. N 叉树的后序遍历(递归版,带测试用例)-Java版
  • YOLO11追踪简单应用
  • Spring Web MVC 入门秘籍:从概念到实践的快速通道(上)
  • 网站是什么字体企业内网模板
  • 建一个小型购物网站要有服务器网易博客搬家wordpress
  • 申威服务器安装Nacos 2.0.3 RPM包详细步骤(Kylin V10 sw_64架构)​附安装包
  • 当同一个弹性云服务器所在子网同时设置了snat和弹性公网IP时,会优先使用哪个
  • 基于Chrome140的TK账号自动化(关键词浏览)——需求分析环境搭建(一)
  • 如何自建内网穿透(FRP)服务器
  • 服务器上用Slurm 管理训练bash 脚本任务