uniapp多格式文件选择(APP,H5)

uniapp多格式文件选择(APP,H5)

背景

从手机选择文件进行上传是移动端很常见的需求,在原生开发时由于平台专一性很容易实现。但是用uniapp开发官方提供的API在APP平台只能选择图片和视频,选择其他格式的File也只有H5平台提供了相关API。虽然通过NativeJs也能实现选择多格式文件,但是需要对原生开发有一定的了解,而且不太稳定。所以本文提供一个能抹平平台差异,并且通用的方式来选择手机端的多格式文件,但是只限于APP和H5平台。先上个Android端的效果图:

在这里插入图片描述

实现

思路是通过renderjs来实现,通过在renderjs中创建一个input为file类型的dom元素,然后手动触发dom的click方法,则会弹出文件选择框(如上)。

代码实现

从上截图可以知道,页面上就一个按钮,通过点击按钮触发renderjs中的函数,然后执行dom相关操作,代码相对简单,这里就直接上代码:

<template>
	<view class="content">
		<button @click="fileChoose">文件选择</button>
		<view :fileData="fileData" :change:fileData="renderJS.receiveFileData"/>
	</view>
</template>

<script>
	export default {
   
		data() {
   
			return {
   
				fileData: ''
			}
		},
		onLoad() {
   },
		methods: {
   
			fileChoose(){
   
				this.fileData = 'test'
				//这里将fileData定时置空,否则下次点击不会触发renderjs函数
				setTimeout(()=> {
   
					this.fileData = ''
				},1000)
			},
			//从renderjs中触发的函数回调
			receiveRenderFile(result){
   
				console.log(result)
			}
		}
	}
</script>
<script module="renderJS" lang="renderjs">
	export default {
   
		data() {
   
			return {
   }
		},
		mounted() {
   
			console.log('1111111111mounted')
		},
		methods: {
   
			receiveFileData(newValue, oldValue, ownerVm, vm){
   
				if(!newValue){
   
					return
				}
				this.createFileInputDom(ownerVm)
			},
			//手动创建dom
			createFileInputDom(ownerVm){
   
				let fileInput = document.createElement('input')
				//设置input为file类型
				fileInput.setAttribute('type','file')
				//设置file格式为素有
				fileInput.setAttribute('accept','*')
				//手动触发dom点击事件
				fileInput.click()
				fileInput.addEventListener('change', e => {
   
					//获取file对象
					let file = e.target.files[0]
					//转化为URL路径
					const filePath = URL.createObjectURL(file)
					//将文件名和文件路径回调到视图层
					ownerVm.callMethod('receiveRenderFile',{
   
						name: file.name,
						filePath: filePath
					})
					//事件回调之后销毁dom
					fileInput = null
				})
			}
		}
	}
</script>
<style>
</style>

运行结果

我们这里选择手机一个为工作助手的apk文件
在这里插入图片描述

receiveRenderFile函数中打印如下:

{
   
    "name": "工作助手.apk",
    "filePath": "blob:file:///07f057dc-b51b-445c-9fb8-8ec9c64075c9"
}

拿到名字和路径之后我们就可以使用uni.uploadFile相关API进行上传。

注意事项

由于本人使用的是Android手机,苹果手机上未尝试过这种方式,iOS平台不能保证有用(理论上来说应该是支持的)。

尾巴

今天的文章就到这里了,希望能给大家帮助,如果喜欢我的文章,欢迎给我点赞,评论,关注,谢谢大家!

相关推荐

  1. uniapp封装websocket文件app、h5兼容)

    2024-01-31 13:22:02       40 阅读
  2. uniapp APP 上传文件

    2024-01-31 13:22:02       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-31 13:22:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-31 13:22:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-31 13:22:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-31 13:22:02       18 阅读

热门阅读

  1. Mybatis

    2024-01-31 13:22:02       30 阅读
  2. 认识并使用OkHttp3

    2024-01-31 13:22:02       35 阅读
  3. C++ 蓝桥杯历届试题 —— 小苹果题目情景及代码

    2024-01-31 13:22:02       38 阅读
  4. Delphi 析构函数(Destructor)

    2024-01-31 13:22:02       36 阅读
  5. k8s学习-通过Service访问Pod

    2024-01-31 13:22:02       31 阅读
  6. PyCharm常用快捷键和设置

    2024-01-31 13:22:02       34 阅读
  7. Centos 查看版本

    2024-01-31 13:22:02       37 阅读
  8. LeetCode每日一题 | 2670. 找出不同元素数目差数组

    2024-01-31 13:22:02       38 阅读
  9. 《Docker极简教程》--前言--本书的目的和目标

    2024-01-31 13:22:02       41 阅读
  10. 一次Rust重写基础软件的实践(三)

    2024-01-31 13:22:02       24 阅读
  11. SpringBoot实现动态数据源配置

    2024-01-31 13:22:02       33 阅读
  12. 1.29C语言 sscanf函数的用法 abs整数绝对值函数

    2024-01-31 13:22:02       33 阅读
  13. 数据结构-并查集

    2024-01-31 13:22:02       33 阅读