uniapp微信小程序 选择聊天记录文件上传

本文详细介绍了微信小程序中使用`wx.chooseMessageFile`选择文件并使用`uni.uploadFile`上传到服务器的步骤,包括单文件和多文件上传的示例。同时,提到了两个常见问题:页面刷新导致的数据问题和`extension`参数在不同平台的兼容性问题。针对文件类型限制,提供了检查文件扩展名的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

精简版总结

示例

容易踩的坑

1、页面刷新问题

2、extension问题


精简版总结

单文件

wx.chooseMessageFile({
	count: 1,//限制选择的文件数量
	type: 'file',//非图片和视频的文件,不选默认为all
  //type:'video',//视频
  //type:'image',//图片
	success (res) {
	 const tempFilePaths = res.tempFiles
		 uni.uploadFile({
			url: 'https://....', 
			filePath: tempFilePaths[0].path,//选择单个路径
			name: 'file',//后端需要拿到这个Key来获取二进制文件内容
			header:{
				'X-Token':'Bearer ' + store.state.app.token
			},
			formData:{
				'month':that.date
			},
			success: (uploadFileRes) => {
                //接口返回的数据
				console.log(uploadFileRes.data);
                //接口返回的状态码
				console.log(uploadFileRes.status);
			}
		});
	
	}
})

多个文件

wx.chooseMessageFile({
	count: 10,//限制选择的文件数量
	type: 'file',//非图片和视频的文件,不选默认为all
  //type:'video',//视频
  //type:'image',//图片
	success (res) {
	 const tempFilePaths = res.tempFiles
		 uni.uploadFile({
			url: 'https://....', 
            files:tempFliePaths,//接受的是数组
			header:{
				'X-Token':'Bearer ' + store.state.app.token
			},
			formData:{
				'month':that.date
			},
			success: (uploadFileRes) => {
                //接口返回的数据
				console.log(uploadFileRes.data);
                //接口返回的状态码
				console.log(uploadFileRes.status);
			}
		});
	
	}
})

PS:files和filePath/name只能二选一组

示例

此处用xlsx文件作实例,选择聊天记录中的xlsx文件上传到指定接口中。

let that=this//保留vue实例
wx.chooseMessageFile({
	count: 1,//限制选择的文件数量
	type: 'file',//非图片和视频的文件,不选默认为all
    extension:['xlsx','.xlsx'],//此处限制文件类型
	success (res) {
	 const tempFilePaths = res.tempFiles
	 console.log('临时路径',tempFilePaths)
		 uni.uploadFile({
			url: 'https://....', 
			filePath: tempFilePaths[0].path,
			name: 'file',
			header:{
				'X-Token':'Bearer ' + store.state.app.token
			},
			formData:{
				'month':that.date
			},
			success: (uploadFileRes) => {
                //接口返回的数据
				console.log(uploadFileRes.data);
                //接口返回的状态码
				console.log(uploadFileRes.status);
			}
		});
	}
})

因为某些微信版本extension可能不生效,或者又想要对提交的文件名做校验,建议参考我下面的代码。

let that=this//保留vue实例
wx.chooseMessageFile({
	count: 1,//限制选择的文件数量
	type: 'file',//非图片和视频的文件,不选默认为all
	success (res) {
	 const tempFilePaths = res.tempFiles
	 console.log('临时路径',tempFilePaths)
	 let filename = res.tempFiles[0].name
	 //客制化判断文件名,判断是不是xlsx文件,仅为参考,可自行变化
	 if(filename.lastIndexOf('.xlsx')==filename.length-5){
		 uni.uploadFile({
			url: 'https://....', 
			filePath: tempFilePaths[0].path,
			name: 'file',
			header:{
				'X-Token':'Bearer ' + store.state.app.token
			},
			formData:{
				'month':that.date
			},
			success: (uploadFileRes) => {
                //接口返回的数据
				console.log(uploadFileRes.data);
                //接口返回的状态码
				console.log(uploadFileRes.status);
			}
		});
		
	 }else{
         //客制化提示文件类型错误
		 uni.showToast({
			title: '请选择xlsx文件',
			icon:'error',
			duration: 2000
		 });
	 }

	}
})

容易踩的坑

1、页面刷新问题

调用chooseMessageFile会离开页面,再次返回时,会触发每次加载进来的生命周期,如uniapp的onShow,如果onShow对数据进行过处理。则uni.uploadFile()方法调用时,数据已经是新数据。如代码中的that.date。

2、extension问题

  extension:['xlsx','.xlsx'],//此处限制文件类型

大家可能发现,为什么这里写了两种,是因为ios的文件扩展名管理中没有一点“.”,如果不做兼容,则Ios端小程序会出错。

当没有限制过滤时,ios和安卓如下图所示。

ios没有限制
安卓没有限制

 当有正确限制时,即".xlsx"和"xlsx",如下图所示。

ios有限制
安卓有限制

 当限制错误,没有适配ios时,即没有"xlsx"

ios限制错误

 可以看见什么都没有了,如果安卓没有适配".xlsx",也应该类似,这里没有作测试。

如果有更多的坑,欢迎评论补充。

UniApp是一款跨平台的开发框架,可以使用它来快速实现微信的聊天框和表情功能。 首先,我们可以使用UniApp的页面组件来实现聊天框。可以使用`<textarea>`和`<input>`标签来创建输入框,并使用`<button>`标签来创建发送按钮。在发送按钮的点击事件中,可以使用uni-app提供的API发送消息到服务器。 其次,实现聊天框的展示可以使用`<scroll-view>`标签来创建一个可滚动的聊天内容容器,并在其中动态渲染聊天消息。可以使用`v-for`指令遍历消息数组,使用`<view>`标签展示每一条消息的内容。 对于表情功能,我们可以使用第三方表情库,如EmojiMart,来提供表情选择框。首先安装并引入EmojiMart的库文件,然后创建一个表情选择器的弹窗组件。可以使用`<swiper>`标签来创建一个可以左右滑动切换表情分类的容器,并使用`v-for`指令遍历表情数组。当用户点击某个表情时,可以将表情的编码添加到输入框中。 为了实现表情的显示,我们还需要对输入框内容进行转义处理。可以使用正则表达式匹配输入框的内容中的表情编码,并将其替换为对应的表情图片。 通过以上步骤,我们就可以实现UniApp中的微信聊天框和表情功能。当用户在输入框中输入文字,并点击发送按钮时,消息将会发送到服务器并展示在聊天框中。用户可以点击表情选择选择表情,并插入到输入框中。聊天框中的表情将会被转义为对应的表情图片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值