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

190 lines
5.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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