微信小程序实现下载 上传表格(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'
				});
			}
		});
	};
相关推荐
2601_9499506312 小时前
考研英语资料太散?用小程序把真题、词汇和错题放到一起
人工智能·学习·考研·小程序·刷题·小程序推荐
lhldsg14 小时前
树洞倾诉的核心需求与产品定位误区
java·前端·小程序
lhldsg15 小时前
宠物同城领养平台开发实战:从需求分析到上线部署指南
java·前端·小程序·需求分析·宠物
171320330计算机毕设编程15 小时前
基于SpringBoot的在线拍卖系统
android·java·spring boot·小程序·课程设计
2501_9160074716 小时前
Flutter与游戏App加固避坑指南:如何为混合开发与高交互应用选对安全方案?
安全·flutter·游戏·ios·小程序·uni-app·iphone
andrsted19 小时前
老师可以用小程序在线整理题库、课堂检测和错题集
学习·微信小程序·小程序·学习方法
show43319 小时前
2026小程序视频转文字多语种识别引擎选型:22方言25外语
小程序·音视频
学习星球2 天前
AI Agent 成本工程实战:从 OpenAI Codex 的 8 个“烧 Token“Bug 学起
人工智能·设计模式·微信小程序
律宏阔2 天前
微信小程序使用 Orval + OpenAPI 自动生成接口:Axios 兼容踩坑记录
前端·微信小程序
律宏阔2 天前
微信小程序集成 TDesign 完整记录:解决 NPM packages not found
前端·微信小程序