YZProjectCloud/yanzhu-ui-app/miniprogram/utils/upload.js

140 lines
3.7 KiB
JavaScript

/**
* 文件上传工具类
* 封装微信小程序文件上传功能
*/
const config = require('../config.js');
const { getToken } = require('../utils/auth.js');
/**
* 文件上传工具类
*/
class FileUploader {
constructor() {
this.baseUrl = config.baseUrl;
}
/**
* 同步上传单个文件
* @param {string} filePath - 文件路径
* @param {Object} options - 上传配置选项
* @param {string} options.uploadUrl - 上传接口地址,默认为 /file/upload
* @param {string} options.name - 上传字段名,默认为 'file'
* @param {Object} options.formData - 额外表单数据
* @param {Object} options.header - 额外请求头
* @returns {Promise} 返回上传结果的Promise
*/
syncUploadFile(filePath, options = {}) {
const {
uploadUrl = '/file/upload',
name = 'file',
formData = {},
header = {}
} = options;
return new Promise((resolve, reject) => {
wx.uploadFile({
url: this.baseUrl + uploadUrl,
filePath: filePath,
name: name,
formData: formData,
header: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'Authorization': 'Bearer ' + getToken(),
...header
},
success: (res) => {
try {
const data = JSON.parse(res.data);
resolve({
success: true,
data: data,
url: data.data?.url || ''
});
} catch (error) {
reject({
success: false,
error: error,
message: '服务器返回数据格式错误'
});
}
},
fail: (err) => {
console.error('文件上传失败:', err);
wx.showToast({
title: '网络出错,上传失败',
icon: 'none',
duration: 1000
});
reject({
success: false,
error: err,
message: '网络出错,上传失败'
});
}
});
});
}
/**
* 批量上传文件
* @param {Array<string>} filePaths - 文件路径数组
* @param {Object} options - 上传配置选项
* @returns {Promise<Array>} 返回上传成功的URL数组
*/
async uploadFiles(filePaths, options = {}) {
if (!Array.isArray(filePaths) || filePaths.length === 0) {
return [];
}
const fileUrls = [];
for (const filePath of filePaths) {
try {
if (filePath.indexOf("http://tmp/") === -1) {
fileUrls.push(filePath);
continue;
}
const result = await this.syncUploadFile(filePath, options);
if (result.success && result.url) {
fileUrls.push(result.url);
}
} catch (error) {
console.error('单个文件上传失败:', error);
// 继续上传其他文件,不中断整个流程
}
}
return fileUrls;
}
/**
* 上传图片(兼容旧版本)
* @param {string} filePath - 图片路径
* @returns {Promise} 返回上传结果的Promise
*/
syncUploadImage(filePath) {
return this.syncUploadFile(filePath);
}
/**
* 批量上传图片(兼容旧版本)
* @param {Array<string>} files - 图片路径数组
* @returns {Promise<Array>} 返回上传成功的URL数组
*/
uploadImages(files) {
return this.uploadFiles(files);
}
}
// 创建单例实例
const fileUploader = new FileUploader();
// 导出工具函数
module.exports = {
FileUploader,
fileUploader,
syncUploadFile: fileUploader.syncUploadFile.bind(fileUploader),
uploadFiles: fileUploader.uploadFiles.bind(fileUploader),
syncUploadImage: fileUploader.syncUploadImage.bind(fileUploader),
uploadImages: fileUploader.uploadImages.bind(fileUploader)
};