微信小程序使用webview实现文件上传功能

这篇具有很好参考价值的文章主要介绍了微信小程序使用webview实现文件上传功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信小程序使用webview实现文件上传功能(uni-app)

项目开发了一个批示单的功能,用户填写批示单信息要上传正文及附件(多文件上传,有需要可在文章末尾查看),上传文件功能原调用的是uni.chooseMessageFile方法选择聊天记录中文件。

问题:用户在电脑端打开小程序后发现选择文件按钮点击无反应。
百度后发现此方法电脑端无法使用,并且微信平台暂时没有具体方法,有网上小伙伴说用webview结合input实现。

具体实现:
原设计:A页面选择添加文件后提交
修改后:添加一个B页面(upload文件),在B页面引入webview
A页面跳转到 ===> B页面 接入webview ===> webview(html)使用input选择文件 文件获取后postMessage并返回,具体代码如下

B页面(uploadFile.vue)

<template>
	<view>
	    <!-- 测试完成后改为线上地址 -->
		<web-view src="http://127.0.0.1:5500/%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6/uploadFile.html"
			@message="handleMessage"></web-view>
	</view>
</template>
<script>
	export default {
		methods: {
			handleMessage(e) {
				console.log('接收到的消息:' + JSON.parse(e.detail.data));
				uni.setStorageSync('fileMsg', JSON.parse(e.detail.data))
			}
		}
	}
</script>

uploadFile.html

创建一个文件夹用来存放webview资源(uploadFile.html是在小程序中接入,本地测试时用vscode打开文件,使用live Serve创建一个本地服务,将服务地址复制放在B页面webview的src中)
小程序上传文件 uniapp 上传文件 webview,uni-app/微信小程序,微信小程序,uni-app

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>上传文件</title>
    <style>
        .uploadFilePage {
            display: flex;
            flex-direction: column;
            align-items: center;
        }

        .inputBox {
            width: 320px;
            height: 220px;
            color: #228EFF;
            font-size: 18px;
            margin-top: 100px;
            border: 1px dashed #228EFF;
            border-radius: 8px;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
        }

        .inputBox img {
            width: 130px;
            height: 130px;
            margin-bottom: 15px;
        }

        .inputBox .tips {
            font-size: 12px;
            color: #666;
            line-height: 30px;
        }


        .fileInput {
            display: none;
        }

        .fileList {
            line-height: 35px;
            margin-top: 20px;
        }

        .fileList .fileOne {
            display: flex;
            align-items: center;
        }

        .fileList .deleteIconBox {
            width: 50px;
            height: 35px;
            display: flex;
            align-items: center;
            justify-content: center;
        }

        .fileList .deleteIconBox img {
            width: 26px;
            height: 26px;
        }

        .goBackBtn {
            width: 120px;
            height: 45px;
            line-height: 45px;
            text-align: center;
            background-color: #228EFF;
            border-radius: 6px;
            color: #fff;
            margin-top: 35px;
        }

        .alert {
            position: fixed;
            top: 40%;
            left: 50%;
            transform: translate(-50%, -50%);
            padding: 10px;
            background-color: #faa734;
            color: #fff;
            border-radius: 6px;
        }
    </style>
    <!-- 微信 JS-SDK 如果不需要兼容小程序,则无需引用此 JS 文件。 -->
    <script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
    <!-- uni 的 SDK,必须引用。 -->
    <script type="text/javascript" src="//js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.0.1.52.js"></script>
    <script src="./vue.min.js"></script>
</head>

<body>
    <div class="uploadFilePage" id="app">
        <div class="inputBox" @click="makeFileInputClick">
            <img src="./image/uploadIcon.png" alt="">
            <div class="text">点击上传</div>
            <div class="tips">* 文件大小限制为10MB</div>
            <input type="file" class="fileInput" name="222" @change="chooseFile" ref="fileInput">
        </div>
        <div class="fileList">
            <div v-for="(item, index) in filesList.basicData" :key="index" class="fileOne">{{item.name}} 上传成功 <div
                    class="deleteIconBox" @click="deleteFile(index)"><img src="./image/deleteIcon.png" alt="">
                </div>
            </div>
        </div>
        <div @click="goBack" class="goBackBtn">完成</div>
        <div class="alert" v-show="isShowAlert">文件大小超过限制,请重新上传</div>
    </div>

    <script>
        console.log(Vue);
        new Vue({
            el: '#app',
            data: {
                filesList: {
                    basicData: [],  // 原始数据
                    handledData: []  // 转化为base64的数据
                },
                isShowAlert: false
            },
            methods: {
                makeFileInputClick() {
                    this.$refs.fileInput.click()
                },
                // 文件转base64
                fileToBase64(file) {
                    return new Promise(function (resolve, reject) {
                        var reader = new FileReader();
                        reader.readAsDataURL(file);
                        reader.onload = function () {
                            typeof reader.result === 'string' && resolve(reader.result) || reject();
                        };
                        reader.onerror = function (error) { return reject(error); };
                    });
                },
                async chooseFile(e) {
                    let fileList = this.$refs.fileInput.files
                    for (const item of fileList) {
                    	// 限制文件大小
                        if (item.size / 1024 / 1024 > 10) {
                            this.isShowAlert = true;
                            setTimeout(() => {
                                this.isShowAlert = false;
                            }, 2500)
                            return
                        }
                        this.filesList.basicData.push(item);
                        this.filesList.handledData.push({ name: item.name, file: await this.fileToBase64(item) });
                    }

                },
                deleteFile(index) {
                    this.filesList.basicData.splice(index, 1)
                    this.filesList.handledData.splice(index, 1)
                },
                goBack() {
                    uni.postMessage({
                        data: JSON.stringify(this.filesList.handledData)
                    });
                    uni.navigateBack()
                }
            }
        })
    </script>
</body>

</html>

小程序上传文件 uniapp 上传文件 webview,uni-app/微信小程序,微信小程序,uni-app

A页面

onShow() {
	if (!uni.getStorageSync('fileMsg')) return
	let fileMsg = uni.getStorageSync('fileMsg');
	uni.removeStorageSync('fileMsg');
	fileMsg.forEach(item => {
		item.file = item.file.split('base64,')[1]  // 不加此句是报了下图的错误,百度后是由于base64,及之前的原因,删除之后就不报错了
		this.base64ToTempFilePath(item.name, item.file, (tempFilePath) => {
			console.log('转换成功,临时地址为:', tempFilePath)
			// 自己的业务逻辑...
		}, function() {
			uni.showToast({
				title: '文件转换失败,请重试',
				icon: 'none'
			})
		})
	})
},
methods:{
	base64ToTempFilePath(fileName, base64Data, success, fail) {
		const fs = uni.getFileSystemManager()
		// const fileName = 'temp_image_' + Date.now() + '.png' // 自定义文件名,可根据需要修改
		const filePath = uni.env.USER_DATA_PATH + '/' + fileName
		const buffer = uni.base64ToArrayBuffer(base64Data)
		fs.writeFile({
			filePath,
			data: buffer,
			encoding: 'binary',
			success() {
				success && success(filePath)
			},
			fail() {
				fail && fail()
			}
		})
	},
}

转换为base64时报错,删除base64 中开头的 data:xxx/xxx;base64, 即可
小程序上传文件 uniapp 上传文件 webview,uni-app/微信小程序,微信小程序,uni-app
测试完成后,将html页面及相关文件上传至服务器,并在微信开放平台中进行配置 开发==>开发管理==>业务域名
小程序上传文件 uniapp 上传文件 webview,uni-app/微信小程序,微信小程序,uni-app

多文件上传

微信小程序实现多文件同时上传

本文基于以下文章所写:文章来源地址https://www.toymoban.com/news/detail-839764.html

  • 使用webview实现小程序本地文件上传
  • uni-app 将base64图片转换成临时地址

到了这里,关于微信小程序使用webview实现文件上传功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Appium微信小程序自动化之开启webview调试功能方法封装

    Appium在微信小程序自动化时,需要开启微信的webview调试功能,以方便对webview的元素进行定位。 运行代码之后,可以顺利打开微信,通过向自己发送消息并点击消息,开启webview调试功能: 看到这个页面后,表示启动微信webview调试功能启动生效。 欢迎技术交流:

    2024年04月13日
    浏览(22)
  • 微信小程序文件上传、下载和图片处理、文件操作API的使用

    这次按照我的理解来做这部分的笔记 首先,复习上节课所学的内容。就是网络请求api的使用  现在我有一个需求就是点击按钮实现获取后端返回的图片  先打开服务器  看一下我们要返回的图片路径  书写结构  看一下返回来的数据。是在data下的banners里。因此我们封装一下

    2024年02月04日
    浏览(24)
  • 微信小程序---图片裁剪、旋转、预览、上传功能实现(已经封装成组件,需要的到资源下载)

    1、可以拍摄或选择本地图片上传图片数据 2、图片上传数据可以进行裁剪、选择、取消、裁剪后预览、上传以及限制大小,还可以缩放操作,需要的可以解除限制即可 1、点击图片上传按钮时,跳转页面到cropper进行图片选择剪切 wx.navigateTo({       url: `/pages/cropper/cropper?d

    2023年04月26日
    浏览(27)
  • H5和微信小程序实现文件预览功能

    提示:本文仅供参考: 最近新增了一个需求,要求在H5和微信小程序生成方案并查看ppt和excel功能。本项目是taro框架打包生成的H5和小程序,代码仅供参考。 代码如下(示例): 代码修改如下(示例): 代码如下(示例): 1:先把本地的微信开发者工具,不校验HTTPS关掉再

    2024年02月17日
    浏览(35)
  • 微信小程序webview中嵌套uniapp时的文件下载问题

    前往闪闪の小窝以获得更好的 阅读 和 评论 体验 这个标题就已经够抽象了吧 本来用微信小程序的web-view去嵌套h5已经因为微信的种种限制(微信不希望你把微信小程序当做一个浏览器来用,它就是不想担责)导致微信登录、文件下载等种种微信特色问题已经很烦了,结果我们

    2024年04月12日
    浏览(23)
  • 微信小程序使用阿里云oss设置上传文件的content-type

    图片文件上传到阿里云oss的默认访问content-type是jpge,这个格式在浏览器不能直接打开,需要手动设置上传的content-type 参考链接 UploadTask wx.uploadFile(Object object) OSS调用PostObject用于通过HTML表单上传的方式将文件(Object)上传到指定存储空间(Bucket)。 阿里OSS 上传图片 springboo

    2024年02月12日
    浏览(30)
  • 微信小程序和webview使用postMessage交互

    小程序和webview能交互,但是没有你想的那个完美 小程序向webview传递参数只能使用url携带参数 webview向小程序传递参数可以使用postMessage, 但是注意了,postMessage只会在特定的时机执行 ,请看官方文档 由此可见,如果你想点击webview中的一个按钮A,然后给小程序发消息,然后由

    2024年02月02日
    浏览(26)
  • 微信小程序使用webview打开第三方地址

    1、在page下创建一个webview目录文件包含index.js index.wxml,配置好路由 2、index.js 3、index.wxml 4、跳转 (地址后拼接参数需要转码) 注意:webview页面的title 取得是第三方地址的title标签的内容,且webview页面不支持自定义标题

    2024年02月10日
    浏览(27)
  • uniapp小程序(原生微信小程序也可以使用),获取接口二进制流数据上传文件到服务器

    需求:通过接口返回的二进制流数据,这个流数据他是一个xlsx文档,需要给到用户一个文档线上连接。 下面是具体代码,注意只针对二进制的文件数据,如果图片上传直接调用uploadFile就可以,并且兼容原生微信小程序。  

    2024年02月16日
    浏览(23)
  • 微信小程序使用echarts实现条形统计图功能

    使用echarts实现在微信小程序中统计图的功能,其实很简单,只需要简单的两步就可以实现啦,具体思路如下: 引入echarts组件 调用相应的函数方法 由于需要引入echarts组件,代码行数较多,无法在此粘贴,需要的友友们可以进我的主页,进行免费的资源下载,具体的实现结果

    2024年04月28日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包