150 lines
5.3 KiB
JavaScript
150 lines
5.3 KiB
JavaScript
/**
|
||
* LightApp 文件上传工具类封装
|
||
* * 使用方法:
|
||
* 1. 列表选择上传:
|
||
* FileUploader.showMenuAndUpload({ baseUrl: 'http://...' }).then(res => ...);
|
||
* * 2. 直接调用某种类型上传:
|
||
* FileUploader.directUpload({
|
||
* baseUrl: 'http://...',
|
||
* chooseType: 'chooseImageUpload'
|
||
* }).then(res => ...);
|
||
*/
|
||
import config from "@/config.js"
|
||
|
||
export default {
|
||
/**
|
||
* 默认配置
|
||
*/
|
||
defaults: {
|
||
baseUrl: config.baseUrl, // 必填,API的基础路径
|
||
uploadPath: '/app/oss/upload', // 上传接口路径
|
||
fileKey: 'file',
|
||
maxSize: 10,
|
||
maxSelectNum: 1,
|
||
minTime: 3,
|
||
maxTime: 15,
|
||
transmissionType: 0, // 0-图片地址, 1-base64
|
||
},
|
||
|
||
/**
|
||
* 映射菜单索引到上传类型
|
||
*/
|
||
typeMapping: {
|
||
0: 'chooseImageUpload', // 相册
|
||
1: 'takingPicturesUpload', // 相机
|
||
2: 'takingVideoUpload', // 视频
|
||
3: 'chooseFileUpload' // 文件
|
||
},
|
||
|
||
/**
|
||
* 核心方法:调用 SDK 的 chooseFileUpload
|
||
* @param {Object} options - 配置项
|
||
* @returns {Promise}
|
||
*/
|
||
_executeUpload: function(options) {
|
||
return new Promise((resolve, reject) => {
|
||
// 合并配置
|
||
const config = {
|
||
...this.defaults,
|
||
...options
|
||
};
|
||
|
||
// 构造 SDK 需要的参数结构
|
||
const pam = {
|
||
url: config.baseUrl + config.uploadPath,
|
||
fileKey: config.fileKey,
|
||
params: config.params || {},
|
||
header: config.header || {},
|
||
chooseType: config.chooseType || 'chooseFileUpload',
|
||
transmissionType: config.transmissionType,
|
||
maxSize: config.maxSize,
|
||
maxSelectNum: config.maxSelectNum,
|
||
minTime: config.minTime,
|
||
maxTime: config.maxTime
|
||
};
|
||
|
||
// 针对特定类型的特殊处理 (参考原代码逻辑)
|
||
if (config.chooseType === 'takingPicturesUpload') {
|
||
// 原代码注释中提到: // pam1.fileKey = 'picfile';
|
||
// 如果需要特殊 fileKey 可以在这里处理
|
||
}
|
||
|
||
console.log('开始调用SDK上传, 参数:', pam);
|
||
|
||
if (typeof lightAppJssdk === 'undefined') {
|
||
const msg = 'lightAppJssdk 未定义,请在 爱山东 环境中运行';
|
||
alert(msg);
|
||
return reject(msg);
|
||
}
|
||
lightAppJssdk.uploadFile.chooseFileUpload({
|
||
arg0: pam,
|
||
success: function(data) {
|
||
// 支持传入 success 回调,也支持 Promise resolve
|
||
if (options.success) options.success(data);
|
||
console.log(data)
|
||
resolve(data);
|
||
},
|
||
fail: function(err) {
|
||
// 支持传入 fail 回调,也支持 Promise reject
|
||
if (options.fail) options.fail(err);
|
||
// 默认弹窗提示错误,可以通过 silent: true 关闭
|
||
if (!options.silent) alert(typeof err === 'object' ? JSON.stringify(
|
||
err) : err);
|
||
reject(err);
|
||
}
|
||
});
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 场景1: 弹出菜单选择,然后上传 (封装了原 selectFile)
|
||
* @param {Object} options - 配置项 (需包含 baseUrl)
|
||
*/
|
||
showMenuAndUpload: function(options = {}) {
|
||
return new Promise((resolve, reject) => {
|
||
if (typeof lightAppJssdk === 'undefined') {
|
||
alert('lightAppJssdk 未定义');
|
||
return reject('lightAppJssdk undefined');
|
||
}
|
||
|
||
const menuList = options.menuList || ['相册', '相机', '视频', '文件'];
|
||
|
||
lightAppJssdk.notification.showMediaAlert({
|
||
arg0: menuList,
|
||
success: (data) => {
|
||
// data.index 对应 menuList 的索引
|
||
const selectedType = this.typeMapping[data.index];
|
||
|
||
if (!selectedType) {
|
||
const err = '未知的选择类型';
|
||
if (options.fail) options.fail(err);
|
||
return reject(err);
|
||
}
|
||
|
||
// 选中后,调用核心上传方法
|
||
this._executeUpload({
|
||
...options,
|
||
chooseType: selectedType
|
||
}).then(resolve).catch(reject);
|
||
},
|
||
fail: (err) => {
|
||
if (options.fail) options.fail(err);
|
||
if (!options.silent) alert(err);
|
||
reject(err);
|
||
}
|
||
});
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 场景2: 直接上传 (不弹窗,直接调起特定类型的上传)
|
||
* @param {Object} options - 需包含 baseUrl 和 chooseType
|
||
*/
|
||
directUpload: function(options = {}) {
|
||
if (!options.chooseType) {
|
||
// 如果没传类型,默认当做普通文件上传
|
||
options.chooseType = 'chooseFileUpload';
|
||
}
|
||
return this._executeUpload(options);
|
||
}
|
||
}; |