/** * 文件上传工具 * 统一处理图片、视频、文件上传 */ import request from './request.js' /** * 上传图片 * @param {String} filePath 本地文件路径 * @param {Function} onProgress 上传进度回调 * @returns {Promise} 返回上传结果 */ export function uploadImage(filePath, onProgress) { return new Promise((resolve, reject) => { const token = uni.getStorageSync('token') const uploadTask = uni.uploadFile({ url: request.baseURL + '/api/file/upload', filePath: filePath, name: 'file', header: { 'Authorization': token ? `Bearer ${token}` : '' }, success: (res) => { try { const data = JSON.parse(res.data) if (data.code === 200) { console.log('图片上传成功:', data.data.fileUrl) resolve(data.data) } else { console.error('图片上传失败:', data.message) reject(new Error(data.message || '上传失败')) } } catch (e) { console.error('解析上传结果失败:', e) reject(new Error('上传失败')) } }, fail: (err) => { console.error('图片上传失败:', err) reject(err) } }) // 监听上传进度 if (onProgress && typeof onProgress === 'function') { uploadTask.onProgressUpdate((res) => { onProgress(res.progress) }) } }) } /** * 批量上传图片 * @param {Array} filePaths 本地文件路径数组 * @param {Function} onProgress 上传进度回调 * @returns {Promise} 返回上传结果数组 */ export function uploadImages(filePaths, onProgress) { const total = filePaths.length let completed = 0 const uploadPromises = filePaths.map((filePath, index) => { return uploadImage(filePath, (progress) => { // 计算总体进度 const itemProgress = progress / total const totalProgress = (completed / total * 100) + itemProgress if (onProgress) { onProgress(Math.floor(totalProgress), index, progress) } }).then(result => { completed++ return result }) }) return Promise.all(uploadPromises) } /** * 选择并上传图片 * @param {Object} options 选项 * @param {Number} options.count 最多可选择的图片数量,默认9 * @param {Array} options.sizeType 图片尺寸,默认['original', 'compressed'] * @param {Array} options.sourceType 图片来源,默认['album', 'camera'] * @param {Function} options.onProgress 上传进度回调 * @returns {Promise} 返回上传结果数组 */ export function chooseAndUploadImage(options = {}) { const { count = 9, sizeType = ['original', 'compressed'], sourceType = ['album', 'camera'], onProgress } = options return new Promise((resolve, reject) => { uni.chooseImage({ count, sizeType, sourceType, success: (res) => { const tempFilePaths = res.tempFilePaths console.log('选择了', tempFilePaths.length, '张图片') // 上传图片 uploadImages(tempFilePaths, onProgress) .then(results => { console.log('所有图片上传成功') resolve(results) }) .catch(err => { console.error('图片上传失败:', err) reject(err) }) }, fail: (err) => { console.error('选择图片失败:', err) reject(err) } }) }) } /** * 上传视频 * @param {String} filePath 本地文件路径 * @param {Function} onProgress 上传进度回调 * @returns {Promise} 返回上传结果 */ export function uploadVideo(filePath, onProgress) { return new Promise((resolve, reject) => { const token = uni.getStorageSync('token') const uploadTask = uni.uploadFile({ url: request.baseURL + '/api/file/upload', filePath: filePath, name: 'file', header: { 'Authorization': token ? `Bearer ${token}` : '' }, success: (res) => { try { const data = JSON.parse(res.data) if (data.code === 200) { console.log('视频上传成功:', data.data.fileUrl) resolve(data.data) } else { console.error('视频上传失败:', data.message) reject(new Error(data.message || '上传失败')) } } catch (e) { console.error('解析上传结果失败:', e) reject(new Error('上传失败')) } }, fail: (err) => { console.error('视频上传失败:', err) reject(err) } }) // 监听上传进度 if (onProgress && typeof onProgress === 'function') { uploadTask.onProgressUpdate((res) => { onProgress(res.progress) }) } }) } /** * 上传文件 * @param {String} filePath 本地文件路径 * @param {Function} onProgress 上传进度回调 * @returns {Promise} 返回上传结果 */ export function uploadFile(filePath, onProgress) { return uploadImage(filePath, onProgress) } export default { uploadImage, uploadImages, chooseAndUploadImage, uploadVideo, uploadFile }