// 公共图片上传:选图(仅图片)→ 上传后端(/api/upload,MD5 去重)→ 返回 {id,url,md5} const { uploadFile } = require('./request.js'); const IMG_EXT = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'heic', 'heif']; // 仅允许图片:按扩展名二次校验(chooseMedia mediaType 已限制,这里双保险) function isImagePath(p) { const m = /\.([a-zA-Z0-9]+)(\?.*)?$/.exec(p || ''); return !!m && IMG_EXT.indexOf(m[1].toLowerCase()) >= 0; } // 选择并上传图片,返回 Promise<[{id,url,md5}]>。用户取消时 reject({canceled:true})。 function chooseAndUploadImages(count) { count = count || 1; return new Promise((resolve, reject) => { wx.chooseMedia({ count, mediaType: ['image'], // 仅图片,不允许视频/文件 sizeType: ['compressed'], sourceType: ['album', 'camera'], success(res) { const files = (res.tempFiles || []).filter((f) => isImagePath(f.tempFilePath)); if (!files.length) { reject(new Error('只能上传图片文件')); return; } wx.showLoading({ title: '上传中...', mask: true }); Promise.all(files.map((f) => uploadFile(f.tempFilePath))) .then((list) => { wx.hideLoading(); resolve(list); }) .catch((e) => { wx.hideLoading(); reject(e); }); }, fail(err) { const msg = (err && err.errMsg) || ''; if (/cancel/i.test(msg)) { reject({ canceled: true }); return; } reject(new Error(msg || '选择图片失败')); }, }); }); } // 单张图片,返回 Promise<{id,url,md5}> function chooseAndUploadImage() { return chooseAndUploadImages(1).then((list) => list[0]); } module.exports = { chooseAndUploadImages, chooseAndUploadImage, isImagePath };