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相关操作,代码相对简单,这里就直接上代码:

javascript 复制代码
<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函数中打印如下:

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

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

注意事项

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

尾巴

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

相关推荐
街尾杂货店&1 小时前
word属性解释
uni-app
笨笨狗吞噬者11 小时前
【uniapp】小程序体积优化,JSON文件压缩
前端·微信小程序·uni-app
源码集结号13 小时前
一套智慧工地云平台源码,支持监管端、项目管理端,Java+Spring Cloud +UniApp +MySql技术开发
java·mysql·spring cloud·uni-app·源码·智慧工地·成品系统
木易 士心19 小时前
Uni-App 实现多身份动态切换 TabBar 指南
uni-app
2501_915106321 天前
CDN 可以实现 HTTPS 吗?实战要点、部署模式与真机验证流程
网络协议·http·ios·小程序·https·uni-app·iphone
LoveEate2 天前
uniapp 运行/发版微信小程序
微信小程序·小程序·uni-app
fakaifa3 天前
【高级版】沃德政务招商系统源码+uniapp小程序
小程序·uni-app·源码下载·沃德政务招商系统·招商系统源码
weixin_446938873 天前
uniapp vue-i18n如何使用
前端·vue.js·uni-app
有来技术3 天前
UniApp 自定义导航栏适配指南:微信小程序胶囊遮挡、H5 与 App 全端通用方案
微信小程序·uni-app
卷Java3 天前
违规通知功能修改说明
java·数据库·微信小程序·uni-app