微信小程序实现下载 上传表格(xls、xlsx)

项目使用uniapp写的 专门给微信小程序做个上传 下载表格,下载方通过临时保存文件然后分享这个文件路径,达到下载功能。

远程请求路径

复制代码
const baseUrl = '' //替换成请求地址

上传方法uploading()

复制代码
const uploading = (() => {
		// 小程序
		const data = {
			后端需要的参数
			file: ''//上传路径
		};

		// 支持的表格扩展名
		const acceptedExtensions = ['xlsx', 'xls', 'csv'];

		uni.chooseMessageFile({
			count: 1,
			type: 'file', // 必须为 'file'
			extension: acceptedExtensions, // ✅ 关键:限制文件扩展名
			success: (res) => {
				const file = res.tempFiles[0];
				if (!file) {
					uni.showToast({
						title: '未选择文件',
						icon: 'none'
					});
					return;
				}

				// 额外校验(防止 extension 失效)
				const fileName = file.name || '';
				const ext = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
				if (!acceptedExtensions.includes(ext)) {
					uni.showToast({
						title: '仅支持 Excel 或 CSV 文件',
						icon: 'none',
						duration: 1000,
					});

					return;
				}

				// 开始上传
				uni.showLoading({
					title: '上传中...',
					mask: true
				});

				const uploadTask = uni.uploadFile({

					url: baseUrl + 'outsideProvince/importOutsideList', //接口
					filePath: file.path, // ✅ 临时文件路径
					dataType: 'json',
					name: 'file', // 后端接收字段名
					formData: {
						shareId: data.shareId,
						phone: data.phone,
						name: data.name,
						file
					},
					success: (uploadRes) => {
						uni.hideLoading();
						let resData;
						resData = JSON.parse(uploadRes.data);
						console.log(resData.code == 200, '0000', resData)
						if (resData.code == 200) {

							if (resData.warn) {
								uni.showModal({
									icon: 'exception',
									content: resData.warn, // 支持长文本、换行
									showCancel: false,

								})
							} else {
								uni.showToast({
									title: '上传完成',
									icon: 'success',
									duration: 2000,
								});
							}
							var datas = {
								shareId: person.shareId,
								search: person.searchVal,
								phone: person.phone,


							};
							selectOutsideList(datas).then((res) => {

								if (res.code == 200) {
									person.productList = res.data

								}
							})
						} else {
							uni.showToast({
								title: resData.msg || '上传失败',
								icon: 'none',
								duration: 1000,
							});
						}

					},
					fail: (err) => {
						uni.hideLoading();
						console.error('上传失败:', err);
						uni.showToast({
							title: '上传失败,请重试',
							icon: 'none',
							duration: 1000,
						});
					}
				});

				// 安全监听进度
				if (uploadTask && typeof uploadTask.onProgressUpdate === 'function') {
					uploadTask.onProgressUpdate((progressRes) => {
						console.log('上传进度:', progressRes.progress + '%');
						
						// 可选:更新页面进度 this.progress = progressRes.progress;
					});
				}
			},
			fail: (err) => {
				console.error('选择文件失败:', err);
				uni.showToast({
					title: '取消选择或选择失败',
					icon: 'none'
				});
			}
		});

下载方法download(),通过临时保存文件然后分享这个文件路径,达到下载功能。

复制代码
const download = () => {
		// const shareId = '1447090'; //后端需要的参数
		// const phone = '123';//后端需要的参数
		
		// 	// 替换为你的实际接口地址
		const baseUrls = baseUrl + 'outsideProvince/exportOutsideList';
		const url = `${baseUrls}?shareId=${encodeURIComponent(shareId)}&phone=${encodeURIComponent(phone)}`;

		uni.showLoading({
			title: '生成文件...'
		});

		uni.downloadFile({
			url,
			success: (res) => {
				uni.hideLoading();
				if (res.statusCode !== 200) {
					uni.showToast({
						title: `下载失败(${res.statusCode})`,
						icon: 'none'
					});
					return;
				}

				// 仅在微信小程序中使用 wx.shareFileMessage
				// #ifdef MP-WEIXIN
				if (typeof wx !== 'undefined' && wx.shareFileMessage) {
					wx.shareFileMessage({
						filePath: res.tempFilePath,
						fileName: '报价.xlsx',
						success: () => {
							uni.showToast({
								title: '分享成功',
								icon: 'success'
							});
						},
						fail: (err) => {
							console.error('分享失败:', err);
							uni.showToast({
								title: '分享失败',
								icon: 'none'
							});
						}
					});
				} else {
					uni.showToast({
						title: '当前环境不支持文件分享',
						icon: 'none'
					});
				}
				// #endif

				// #ifndef MP-WEIXIN
				// 其他平台可考虑保存到本地或提示用户
				uni.showToast({
					title: '仅微信小程序支持分享文件',
					icon: 'none'
				});
				// 或调用 uni.saveFile + uni.openDocument 等方式预览
				// #endif
			},
			fail: (err) => {
				uni.hideLoading();
				console.error('下载失败:', err);
				uni.showToast({
					title: '网络错误',
					icon: 'none'
				});
			}
		});
	};
相关推荐
码视野2 小时前
完全开源-支持二开-可做毕业论文-家政服务预约小程序
小程序
码视野2 小时前
全开源-健身运动预约小程序 — 从需求到原型的全栈实践
小程序
游戏开发爱好者83 小时前
深入理解iOSTime Profiler:提升iOS应用性能的关键工具
android·ios·小程序·https·uni-app·iphone·webview
tianxiaxue13 小时前
微信小程序如何跟企微互通
微信小程序·小程序·企业微信
Greg_Zhong3 小时前
微信小程序中canvas绘制面积图,解决手机和模拟器都能渲染不溢出问题
微信小程序·小程序canvas绘制面积图
小小王app小程序开发4 小时前
潮玩抽赏盲盒小程序玩法分析:2026 潮玩风口,技术合规双驱动
小程序
小小王app小程序开发4 小时前
AI 智能体小程序玩法分析:2026 千亿 AI 风口,冠品科技赋能低门槛落地
人工智能·科技·小程序
头发还在的女程序员17 小时前
家政SaaS平台开源:从供应商入驻到分账结算,源码如何设计?
小程序·开源
焦糖玛奇朵婷20 小时前
解锁扭蛋机小程序的五大优势
java·大数据·服务器·前端·小程序
web前端神器1 天前
记录uniapp小程序的报错
小程序·uni-app·apache