peixue-dev/peidu/uniapp/utils/upload.js

190 lines
5.1 KiB
JavaScript
Raw Normal View History

/**
* 文件上传工具
* 统一处理图片视频文件上传
*/
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
}