You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
7.8 KiB
274 lines
7.8 KiB
/**
|
|
* 阿里云oss工具类
|
|
*/
|
|
var aliyunOSSUtil = {};
|
|
var counterNum = 0;
|
|
|
|
/**
|
|
* 上传至阿里云oss
|
|
vk.callFunctionUtil.uploadFile({
|
|
filePath:tempFilePath,
|
|
fileType:"image",
|
|
provider:"aliyun",
|
|
index,
|
|
onUploadProgress:function(res){
|
|
// 上传过程中
|
|
if (res.progress > 0) {
|
|
if(list[index]){
|
|
list[index].progress = res.progress;
|
|
|
|
}
|
|
}
|
|
},
|
|
success:function(res){
|
|
// 上传成功
|
|
|
|
},
|
|
fail:function(res){
|
|
// 上传失败
|
|
|
|
}
|
|
});
|
|
*/
|
|
aliyunOSSUtil.uploadFile = function(obj) {
|
|
let {
|
|
filePath,
|
|
fileType = "image",
|
|
name = "file",
|
|
header = {
|
|
"x-oss-forbid-overwrite": true,
|
|
},
|
|
index = 0,
|
|
file = {},
|
|
needSave = false,
|
|
category_id,
|
|
title,
|
|
cloudPathRemoveChinese = true, // 删除文件名中的中文
|
|
cloudDirectory,
|
|
} = obj;
|
|
let vk = getApp().globalData.vk;
|
|
if (title) vk.showLoading(title);
|
|
let fileNameObj = createFileName(obj);
|
|
let aliyunOSS = getConfig();
|
|
let fileName = fileNameObj.fileFullName;
|
|
let formData = vk.pubfn.copyObject(aliyunOSS.uploadData);
|
|
formData["key"] = fileName; // 存储在oss的文件路径
|
|
/**
|
|
* 特别说明
|
|
* 若已知本地图片,则使用formData["name"] = filePath
|
|
* 若已知base64,则是用formData["file"] = file;// file base64字符串转成blob对象
|
|
*/
|
|
if (filePath.indexOf(";base64,") > -1) {
|
|
formData["file"] = dataURLtoBlob(filePath);
|
|
} else {
|
|
formData["name"] = filePath;
|
|
}
|
|
let Logger = {};
|
|
Logger.startTime = new Date().getTime();
|
|
Logger.filePath = filePath;
|
|
return new Promise((resolve, reject) => {
|
|
let uploadTask = uni.uploadFile({
|
|
url: aliyunOSS.action,
|
|
filePath,
|
|
name,
|
|
header,
|
|
formData: formData,
|
|
success: function(res) {
|
|
if (title) vk.hideLoading();
|
|
if (![200, 201].includes(res.statusCode)) {
|
|
if (typeof obj.fail === "function") obj.fail(res);
|
|
Logger.error = res;
|
|
} else {
|
|
// 上传成功
|
|
res.fileID = fileNameObj.url;
|
|
res.url = fileNameObj.url;
|
|
Logger.result = res;
|
|
if (typeof obj.success === "function") obj.success(res);
|
|
resolve(res);
|
|
if (needSave) {
|
|
// 保存文件记录到数据库
|
|
vk.userCenter.addUploadRecord({
|
|
data: {
|
|
url: res.fileID,
|
|
name: file.name,
|
|
size: file.size,
|
|
file_id: res.fileID,
|
|
provider: "aliyun",
|
|
category_id
|
|
},
|
|
filePath,
|
|
fileType,
|
|
success: function() {
|
|
if (typeof obj.addSuccess == "function") obj.addSuccess(res);
|
|
},
|
|
fail: function(res) {
|
|
if (typeof obj.addFail === "function") obj.addFail(res);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
},
|
|
fail: function(res) {
|
|
if (title) vk.hideLoading();
|
|
Logger.error = res;
|
|
if (res.errMsg && res.errMsg.indexOf('fail url not in domain list') > -1) {
|
|
vk.toast('上传域名未在白名单中');
|
|
}
|
|
if (typeof obj.fail === "function") obj.fail(res);
|
|
},
|
|
complete: function() {
|
|
let vk = getApp().globalData.vk;
|
|
let config = vk.callFunctionUtil.config;
|
|
if (config.debug) {
|
|
Logger.endTime = new Date().getTime();
|
|
Logger.runTime = (Logger.endTime - Logger.startTime);
|
|
let colorArr = config.logger.colorArr;
|
|
let colorStr = colorArr[counterNum % colorArr.length];
|
|
counterNum++;
|
|
console.log("%c--------【开始】【阿里云oss文件上传】--------", 'color: ' + colorStr + ';font-size: 12px;font-weight: bold;');
|
|
console.log("【本地文件】: ", Logger.filePath);
|
|
console.log("【返回数据】: ", Logger.result);
|
|
console.log("【预览地址】: ", Logger.result.fileID);
|
|
console.log("【上传耗时】: ", Logger.runTime, "毫秒");
|
|
console.log("【上传时间】: ", vk.pubfn.timeFormat(Logger.startTime, "yyyy-MM-dd hh:mm:ss"));
|
|
if (Logger.error) console.error("【error】:", Logger.error);
|
|
console.log("%c--------【结束】【阿里云oss文件上传】--------", 'color: ' + colorStr + ';font-size: 12px;font-weight: bold;');
|
|
}
|
|
}
|
|
});
|
|
uploadTask.onProgressUpdate((res) => {
|
|
if (res.progress > 0) {
|
|
if (typeof obj.onUploadProgress === "function") obj.onUploadProgress(res);
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
|
|
export default aliyunOSSUtil;
|
|
|
|
|
|
// 获取配置
|
|
function getConfig() {
|
|
let vk = getApp().globalData.vk;
|
|
let aliyunOSS = vk.getConfig("service.aliyunOSS");
|
|
let configData = {};
|
|
if (aliyunOSS && aliyunOSS.uploadData && aliyunOSS.uploadData.OSSAccessKeyId) {
|
|
try {
|
|
// 只有开启按userId分组且开启了vk的vuex功能,才可以自动按userId分组
|
|
if (aliyunOSS.groupUserId && typeof vk.getVuex === "function") {
|
|
let userInfo = vk.getVuex("$user.userInfo");
|
|
if (vk.pubfn.isNotNull(userInfo) && userInfo._id) {
|
|
aliyunOSS.dirname += `/${userInfo._id}`;
|
|
}
|
|
}
|
|
} catch (err) {}
|
|
configData = {
|
|
uploadData: {
|
|
OSSAccessKeyId: aliyunOSS.uploadData.OSSAccessKeyId,
|
|
policy: aliyunOSS.uploadData.policy,
|
|
signature: aliyunOSS.uploadData.signature,
|
|
success_action_status: 200,
|
|
key: "test.png"
|
|
},
|
|
action: aliyunOSS.action,
|
|
dirname: aliyunOSS.dirname,
|
|
host: aliyunOSS.host,
|
|
};
|
|
}
|
|
return configData;
|
|
}
|
|
// 生成文件名
|
|
function createFileName(obj = {}) {
|
|
let {
|
|
file,
|
|
filePath,
|
|
index = 0,
|
|
cloudPathRemoveChinese = true,
|
|
cloudDirectory
|
|
} = obj;
|
|
let vk = getApp().globalData.vk;
|
|
let aliyunOSS = getConfig();
|
|
let dirname = aliyunOSS.dirname;
|
|
let host = aliyunOSS.host;
|
|
let fileObj = {};
|
|
|
|
let suffix = getFileSuffix(obj);
|
|
let oldName = index + "." + suffix;
|
|
if (file && file.name) {
|
|
let suffixName = file.name.substring(file.name.lastIndexOf(".") + 1);
|
|
if (suffixName && suffixName.length < 5) oldName = file.name;
|
|
// 只保留["数字","英文",".","-"]
|
|
if (cloudPathRemoveChinese) {
|
|
oldName = oldName.replace(/[^a-zA-Z.-d]/g, '');
|
|
}
|
|
if (oldName.indexOf(".") == 0) oldName = "0" + oldName;
|
|
}
|
|
let date = new Date();
|
|
let dateYYYYMMDD = vk.pubfn.timeFormat(date, "yyyy/MM/dd");
|
|
let dateTime = date.getTime().toString(); // 时间戳
|
|
// 时间戳后8位
|
|
let dateTimeEnd8 = dateTime.substring(dateTime.length - 8, dateTime.length);
|
|
let randomNumber = vk.pubfn.random(8); // 8位随机数
|
|
// 文件路径 = 固定路径名 + 业务路径
|
|
|
|
// 业务路径
|
|
let servicePath = "";
|
|
if (cloudDirectory) {
|
|
// 如果自定义了上传目录,则使用自定义的上传目录
|
|
if (cloudDirectory.lastIndexOf("/") !== cloudDirectory.length-1) {
|
|
cloudDirectory = cloudDirectory + "/";
|
|
}
|
|
servicePath = cloudDirectory;
|
|
} else {
|
|
// 否则,使用年月日作为上传目录
|
|
servicePath = dateYYYYMMDD + "/";
|
|
}
|
|
// 文件名 = 时间戳后8位 - 随机数8位 + 后缀名
|
|
let fileNickName = dateTimeEnd8 + randomNumber + "-" + oldName;
|
|
// 文件相对路径 = 业务目录 + 文件名
|
|
let fileRelativePath = servicePath + fileNickName;
|
|
// 文件名全称(包含文件路径) = 根目录 + 文件相对路径
|
|
let fileFullName = dirname + "/" + fileRelativePath;
|
|
// 外网地址 = 外网域名 + 文件名全称
|
|
let url = host + "/" + fileFullName;
|
|
fileObj.url = url;
|
|
fileObj.fileFullName = fileFullName;
|
|
fileObj.fileNickName = fileNickName;
|
|
return fileObj;
|
|
}
|
|
|
|
function getFileSuffix(obj = {}) {
|
|
let {
|
|
file,
|
|
filePath,
|
|
suffix = "png"
|
|
} = obj;
|
|
if (filePath) {
|
|
let suffixName = filePath.substring(filePath.lastIndexOf(".") + 1);
|
|
if (suffixName && suffixName.length < 5) suffix = suffixName;
|
|
}
|
|
if (file) {
|
|
if (file.path) {
|
|
let suffixName = file.path.substring(file.path.lastIndexOf(".") + 1);
|
|
if (suffixName && suffixName.length < 5) suffix = suffixName;
|
|
}
|
|
if (file.name) {
|
|
let suffixName = file.name.substring(file.name.lastIndexOf(".") + 1);
|
|
if (suffixName && suffixName.length < 5) suffix = suffixName;
|
|
}
|
|
}
|
|
return suffix;
|
|
}
|
|
|
|
function dataURLtoBlob(dataurl) {
|
|
let arr = dataurl.split(','),
|
|
mime = arr[0].match(/:(.*?);/)[1],
|
|
bstr = atob(arr[1]),
|
|
n = bstr.length,
|
|
u8arr = new Uint8Array(n);
|
|
while (n--) {
|
|
u8arr[n] = bstr.charCodeAt(n);
|
|
}
|
|
return new Blob([u8arr], { type: mime });
|
|
}
|