aliyunOSSUtil.js 7.2 KB
Newer Older
VK1688's avatar
1.8.5  
VK1688 已提交
1 2 3 4 5
/**
 * 阿里云oss工具类
 */
var aliyunOSSUtil = {};
var counterNum = 0;
VK1688's avatar
1.8.8  
VK1688 已提交
6

VK1688's avatar
1.8.5  
VK1688 已提交
7 8 9 10 11
/**
 * 上传至阿里云oss
vk.callFunctionUtil.uploadFile({
	filePath:tempFilePath,
	fileType:"image",
VK1688's avatar
1.9.2  
VK1688 已提交
12
	provider:"aliyun",
VK1688's avatar
1.8.5  
VK1688 已提交
13 14 15 16 17 18
	index,
	onUploadProgress:function(res){
		// 上传过程中
		if (res.progress > 0) {
			if(list[index]){
				list[index].progress = res.progress;
VK1688's avatar
1.8.8  
VK1688 已提交
19

VK1688's avatar
1.8.5  
VK1688 已提交
20 21 22 23 24
			}
		}
	},
	success:function(res){
		// 上传成功
VK1688's avatar
1.8.8  
VK1688 已提交
25

VK1688's avatar
1.8.5  
VK1688 已提交
26 27 28
	},
	fail:function(res){
		// 上传失败
VK1688's avatar
1.8.8  
VK1688 已提交
29

VK1688's avatar
1.8.5  
VK1688 已提交
30 31 32 33 34 35
	}
});
 */
aliyunOSSUtil.uploadFile = function(obj) {
	let {
		filePath,
VK1688's avatar
2.0.4  
VK1688 已提交
36
		fileType = "image",
VK1688's avatar
1.8.5  
VK1688 已提交
37 38
		name = "file",
		header = {
VK1688's avatar
2.0.1  
VK1688 已提交
39
			"x-oss-forbid-overwrite": true,
VK1688's avatar
1.8.5  
VK1688 已提交
40 41
		},
		index = 0,
VK1688's avatar
2.0.1  
VK1688 已提交
42
		file = {},
VK1688's avatar
2.0.3  
VK1688 已提交
43
		needSave = false,
VK1688's avatar
VK1688 已提交
44 45
		category_id,
		title,
VK1688's avatar
1.8.5  
VK1688 已提交
46 47
	} = obj;
	let vk = getApp().globalData.vk;
VK1688's avatar
VK1688 已提交
48
	if (title) vk.showLoading(title);
VK1688's avatar
1.8.9  
VK1688 已提交
49
	let fileNameObj = createFileName(obj);
VK1688's avatar
1.8.5  
VK1688 已提交
50 51 52
	let aliyunOSS = getConfig();
	let fileName = fileNameObj.fileFullName;
	let formData = vk.pubfn.copyObject(aliyunOSS.uploadData);
VK1688's avatar
2.0.1  
VK1688 已提交
53
	formData["key"] = fileName; // 存储在oss的文件路径
VK1688's avatar
1.8.5  
VK1688 已提交
54 55 56 57 58
	/**
	 * 特别说明
	 * 若已知本地图片,则使用formData["name"] = filePath
	 * 若已知base64,则是用formData["file"] = file;// file base64字符串转成blob对象
	 */
VK1688's avatar
2.0.1  
VK1688 已提交
59
	if (filePath.indexOf(";base64,") > -1) {
VK1688's avatar
1.8.5  
VK1688 已提交
60
		formData["file"] = dataURLtoBlob(filePath);
VK1688's avatar
2.0.1  
VK1688 已提交
61
	} else {
VK1688's avatar
1.8.5  
VK1688 已提交
62 63 64 65 66
		formData["name"] = filePath;
	}
	let Logger = {};
	Logger.startTime = new Date().getTime();
	Logger.filePath = filePath;
VK1688's avatar
VK1688 已提交
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
	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;
					Logger.result = res;
VK1688's avatar
VK1688 已提交
83 84
					if (typeof obj.success === "function") obj.success(res);
					resolve(res);
VK1688's avatar
VK1688 已提交
85 86 87 88 89 90 91 92 93 94 95 96 97 98
					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() {
VK1688's avatar
VK1688 已提交
99
								if (typeof obj.addSuccess == "function") obj.addSuccess(res);
VK1688's avatar
VK1688 已提交
100 101
							},
							fail: function(res) {
VK1688's avatar
VK1688 已提交
102
								if (typeof obj.addFail === "function") obj.addFail(res);
VK1688's avatar
VK1688 已提交
103 104 105 106 107 108 109
							}
						});
					}
				}
			},
			fail: function(res) {
				if (title) vk.hideLoading();
VK1688's avatar
1.8.5  
VK1688 已提交
110
				Logger.error = res;
VK1688's avatar
2.4.1  
VK1688 已提交
111
				if (res.errMsg && res.errMsg.indexOf('fail url not in domain list') > -1) {
VK1688's avatar
VK1688 已提交
112 113 114 115 116 117 118 119 120 121 122 123 124
					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++;
VK1688's avatar
2.4.1  
VK1688 已提交
125
					console.log("%c--------【开始】【阿里云oss文件上传】--------", 'color: ' + colorStr + ';font-size: 12px;font-weight: bold;');
VK1688's avatar
VK1688 已提交
126 127 128 129 130 131
					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);
VK1688's avatar
2.4.1  
VK1688 已提交
132
					console.log("%c--------【结束】【阿里云oss文件上传】--------", 'color: ' + colorStr + ';font-size: 12px;font-weight: bold;');
VK1688's avatar
2.0.1  
VK1688 已提交
133
				}
VK1688's avatar
1.8.5  
VK1688 已提交
134
			}
VK1688's avatar
VK1688 已提交
135 136 137 138
		});
		uploadTask.onProgressUpdate((res) => {
			if (res.progress > 0) {
				if (typeof obj.onUploadProgress === "function") obj.onUploadProgress(res);
VK1688's avatar
1.8.5  
VK1688 已提交
139
			}
VK1688's avatar
VK1688 已提交
140
		});
VK1688's avatar
1.8.5  
VK1688 已提交
141 142 143 144
	});
};


145
export default aliyunOSSUtil;
VK1688's avatar
1.8.5  
VK1688 已提交
146 147 148


// 获取配置
VK1688's avatar
2.0.1  
VK1688 已提交
149
function getConfig() {
VK1688's avatar
1.8.5  
VK1688 已提交
150 151
	let vk = getApp().globalData.vk;
	let config = vk.callFunctionUtil.getConfig();
VK1688's avatar
2.0.1  
VK1688 已提交
152
	let aliyunOSS = vk.pubfn.getData(config, "service.aliyunOSS");
VK1688's avatar
1.8.5  
VK1688 已提交
153
	let configData = {};
VK1688's avatar
2.0.1  
VK1688 已提交
154
	if (aliyunOSS && aliyunOSS.uploadData && aliyunOSS.uploadData.OSSAccessKeyId) {
VK1688's avatar
1.9.2  
VK1688 已提交
155
		try {
VK1688's avatar
2.0.1  
VK1688 已提交
156
			if (aliyunOSS.groupUserId && typeof vk.getVuex === "function") {
VK1688's avatar
1.9.2  
VK1688 已提交
157
				let userInfo = vk.getVuex("$user.userInfo");
VK1688's avatar
2.0.1  
VK1688 已提交
158 159
				if (vk.pubfn.isNotNull(userInfo) && userInfo._id) {
					aliyunOSS.dirname += `/${userInfo._id}`;
VK1688's avatar
1.9.2  
VK1688 已提交
160 161
				}
			}
VK1688's avatar
2.0.1  
VK1688 已提交
162
		} catch (err) {}
VK1688's avatar
1.8.5  
VK1688 已提交
163
		configData = {
VK1688's avatar
2.0.1  
VK1688 已提交
164
			uploadData: {
VK1688's avatar
1.8.5  
VK1688 已提交
165 166 167
				OSSAccessKeyId: aliyunOSS.uploadData.OSSAccessKeyId,
				policy: aliyunOSS.uploadData.policy,
				signature: aliyunOSS.uploadData.signature,
VK1688's avatar
2.0.1  
VK1688 已提交
168 169
				success_action_status: 200,
				key: "test.png"
VK1688's avatar
1.8.5  
VK1688 已提交
170
			},
VK1688's avatar
2.0.1  
VK1688 已提交
171 172 173
			action: aliyunOSS.action,
			dirname: aliyunOSS.dirname,
			host: aliyunOSS.host,
VK1688's avatar
1.8.5  
VK1688 已提交
174 175 176 177 178
		};
	}
	return configData;
}
// 生成文件名
VK1688's avatar
2.0.1  
VK1688 已提交
179
function createFileName(obj = {}) {
VK1688's avatar
1.8.8  
VK1688 已提交
180
	let {
VK1688's avatar
1.8.9  
VK1688 已提交
181
		index = 0,
VK1688's avatar
2.4.1  
VK1688 已提交
182 183
			file,
			filePath,
VK1688's avatar
1.8.8  
VK1688 已提交
184
	} = obj;
VK1688's avatar
1.8.5  
VK1688 已提交
185 186 187 188 189
	let vk = getApp().globalData.vk;
	let aliyunOSS = getConfig();
	let dirname = aliyunOSS.dirname;
	let host = aliyunOSS.host;
	let fileObj = {};
VK1688's avatar
1.9.2  
VK1688 已提交
190

VK1688's avatar
2.0.4  
VK1688 已提交
191
	let suffix = getFileSuffix(obj);
VK1688's avatar
1.8.9  
VK1688 已提交
192
	let oldName = index + "." + suffix;
VK1688's avatar
2.0.3  
VK1688 已提交
193 194 195
	if (file && file.name) {
		let suffixName = file.name.substring(file.name.lastIndexOf(".") + 1);
		if (suffixName && suffixName.length < 5) oldName = file.name;
VK1688's avatar
VK1688 已提交
196 197 198
		// 只保留["数字","英文",".","-"]
		oldName = oldName.replace(/[^a-zA-Z.-d]/g, '');
		if (oldName.indexOf(".") == 0) oldName = "0" + oldName;
VK1688's avatar
2.0.3  
VK1688 已提交
199
	}
VK1688's avatar
1.8.5  
VK1688 已提交
200
	let date = new Date();
VK1688's avatar
2.0.1  
VK1688 已提交
201
	let dateYYYYMMDD = vk.pubfn.timeFormat(date, "yyyy/MM/dd");
VK1688's avatar
1.8.5  
VK1688 已提交
202 203
	let dateTime = date.getTime().toString(); // 时间戳
	// 时间戳后8位
VK1688's avatar
2.0.1  
VK1688 已提交
204
	let dateTimeEnd8 = dateTime.substring(dateTime.length - 8, dateTime.length);
VK1688's avatar
1.8.5  
VK1688 已提交
205 206 207
	let randomNumber = vk.pubfn.random(8); // 8位随机数
	// 文件路径 = 固定路径名 + 业务路径
	let servicePath = "";
VK1688's avatar
1.8.9  
VK1688 已提交
208
	let newFilePath = dirname + "/" + servicePath + dateYYYYMMDD + "/";
VK1688's avatar
1.8.5  
VK1688 已提交
209 210 211
	// 文件名 = 时间戳后8位 - 随机数8位 + 后缀名
	let fileNickName = dateTimeEnd8 + randomNumber + "-" + oldName;
	// 文件名全称(包含文件路径) = 外网域名 + 文件路径 + 文件名
VK1688's avatar
1.8.9  
VK1688 已提交
212
	let fileFullName = newFilePath + fileNickName;
VK1688's avatar
1.8.5  
VK1688 已提交
213
	// 外网地址 = 外网域名 + 文件路径 + 文件名
VK1688's avatar
2.0.1  
VK1688 已提交
214
	let url = host + "/" + fileFullName;
VK1688's avatar
1.8.5  
VK1688 已提交
215 216 217 218 219
	fileObj.url = url;
	fileObj.fileFullName = fileFullName;
	fileObj.fileNickName = fileNickName;
	return fileObj;
}
VK1688's avatar
2.4.1  
VK1688 已提交
220 221

function getFileSuffix(obj = {}) {
VK1688's avatar
2.0.4  
VK1688 已提交
222 223 224 225 226 227 228 229 230
	let {
		file,
		filePath
	} = obj;
	let suffix = "png";
	if (filePath) {
		let suffixName = filePath.substring(filePath.lastIndexOf(".") + 1);
		if (suffixName && suffixName.length < 5) suffix = suffixName;
	}
VK1688's avatar
2.4.1  
VK1688 已提交
231
	if (file) {
VK1688's avatar
2.0.4  
VK1688 已提交
232 233 234 235 236 237 238 239 240 241 242
		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;
}
VK1688's avatar
1.8.5  
VK1688 已提交
243

VK1688's avatar
2.0.1  
VK1688 已提交
244 245 246 247 248 249
function dataURLtoBlob(dataurl) {
	let arr = dataurl.split(','),
		mime = arr[0].match(/:(.*?);/)[1],
		bstr = atob(arr[1]),
		n = bstr.length,
		u8arr = new Uint8Array(n);
VK1688's avatar
1.8.5  
VK1688 已提交
250 251 252 253
	while (n--) {
		u8arr[n] = bstr.charCodeAt(n);
	}
	return new Blob([u8arr], { type: mime });
VK1688's avatar
1.8.8  
VK1688 已提交
254
}