aliyunOSSUtil.js 5.8 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 36 37
	}
});
 */
aliyunOSSUtil.uploadFile = function(obj) {
	let {
		filePath,
		name = "file",
		header = {
VK1688's avatar
2.0.1  
VK1688 已提交
38
			"x-oss-forbid-overwrite": true,
VK1688's avatar
1.8.5  
VK1688 已提交
39 40
		},
		index = 0,
VK1688's avatar
2.0.1  
VK1688 已提交
41 42
		file = {},
		needSave = false
VK1688's avatar
1.8.5  
VK1688 已提交
43 44
	} = obj;
	let vk = getApp().globalData.vk;
VK1688's avatar
1.8.9  
VK1688 已提交
45
	let fileNameObj = createFileName(obj);
VK1688's avatar
1.8.5  
VK1688 已提交
46 47 48
	let aliyunOSS = getConfig();
	let fileName = fileNameObj.fileFullName;
	let formData = vk.pubfn.copyObject(aliyunOSS.uploadData);
VK1688's avatar
2.0.1  
VK1688 已提交
49
	formData["key"] = fileName; // 存储在oss的文件路径
VK1688's avatar
1.8.5  
VK1688 已提交
50 51 52 53 54
	/**
	 * 特别说明
	 * 若已知本地图片,则使用formData["name"] = filePath
	 * 若已知base64,则是用formData["file"] = file;// file base64字符串转成blob对象
	 */
VK1688's avatar
2.0.1  
VK1688 已提交
55
	if (filePath.indexOf(";base64,") > -1) {
VK1688's avatar
1.8.5  
VK1688 已提交
56
		formData["file"] = dataURLtoBlob(filePath);
VK1688's avatar
2.0.1  
VK1688 已提交
57
	} else {
VK1688's avatar
1.8.5  
VK1688 已提交
58 59 60 61 62 63 64 65 66 67 68
		formData["name"] = filePath;
	}
	let Logger = {};
	Logger.startTime = new Date().getTime();
	Logger.filePath = filePath;
	let uploadTask = uni.uploadFile({
		url: aliyunOSS.action,
		filePath,
		name,
		header,
		formData: formData,
VK1688's avatar
2.0.1  
VK1688 已提交
69
		success: function(res) {
VK1688's avatar
1.8.5  
VK1688 已提交
70
			if (![200, 201].includes(res.statusCode)) {
VK1688's avatar
2.0.1  
VK1688 已提交
71
				if (typeof obj.fail === "function") obj.fail(res);
VK1688's avatar
1.8.5  
VK1688 已提交
72 73 74 75
				Logger.error = res;
			} else {
				// 上传成功
				res.fileID = fileNameObj.url;
VK1688's avatar
2.0.1  
VK1688 已提交
76
				if (typeof obj.success === "function") obj.success(res);
VK1688's avatar
1.8.5  
VK1688 已提交
77
				Logger.result = res;
VK1688's avatar
2.0.1  
VK1688 已提交
78 79 80 81 82 83 84 85 86 87 88 89
				if (needSave) {
					// 保存文件记录到数据库
					vk.userCenter.addUploadRecord({
						data: {
							url: res.fileID,
							name: file.name,
							size: file.size,
							file_id: res.fileID,
							provider: "aliyun"
						}
					});
				}
VK1688's avatar
1.8.5  
VK1688 已提交
90 91
			}
		},
VK1688's avatar
2.0.1  
VK1688 已提交
92
		fail: function(res) {
VK1688's avatar
1.8.5  
VK1688 已提交
93
			Logger.error = res;
VK1688's avatar
2.0.1  
VK1688 已提交
94
			if (typeof obj.fail === "function") obj.fail(res);
VK1688's avatar
1.8.5  
VK1688 已提交
95
		},
VK1688's avatar
2.0.1  
VK1688 已提交
96
		complete: function() {
VK1688's avatar
1.8.5  
VK1688 已提交
97 98
			let vk = getApp().globalData.vk;
			let config = vk.callFunctionUtil.config;
VK1688's avatar
2.0.1  
VK1688 已提交
99
			if (config.debug) {
VK1688's avatar
1.8.5  
VK1688 已提交
100 101 102 103 104
				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.0.1  
VK1688 已提交
105 106
				console.log("%c--------【开始】【阿里云oss文件上传】--------", 'color: ' + colorStr +
					';font-size: 12px;font-weight: bold;');
VK1688's avatar
1.8.5  
VK1688 已提交
107 108 109 110 111
				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"));
VK1688's avatar
2.0.1  
VK1688 已提交
112 113 114
				if (Logger.error) console.error("【error】:", Logger.error);
				console.log("%c--------【结束】【阿里云oss文件上传】--------", 'color: ' + colorStr +
					';font-size: 12px;font-weight: bold;');
VK1688's avatar
1.8.5  
VK1688 已提交
115 116 117 118 119
			}
		}
	});
	uploadTask.onProgressUpdate((res) => {
		if (res.progress > 0) {
VK1688's avatar
2.0.1  
VK1688 已提交
120
			if (typeof obj.onUploadProgress === "function") obj.onUploadProgress(res);
VK1688's avatar
1.8.5  
VK1688 已提交
121 122 123 124 125 126 127 128 129 130
		}
	});
	return uploadTask;
};


module.exports = aliyunOSSUtil;


// 获取配置
VK1688's avatar
2.0.1  
VK1688 已提交
131
function getConfig() {
VK1688's avatar
1.8.5  
VK1688 已提交
132 133
	let vk = getApp().globalData.vk;
	let config = vk.callFunctionUtil.getConfig();
VK1688's avatar
2.0.1  
VK1688 已提交
134
	let aliyunOSS = vk.pubfn.getData(config, "service.aliyunOSS");
VK1688's avatar
1.8.5  
VK1688 已提交
135
	let configData = {};
VK1688's avatar
2.0.1  
VK1688 已提交
136
	if (aliyunOSS && aliyunOSS.uploadData && aliyunOSS.uploadData.OSSAccessKeyId) {
VK1688's avatar
1.9.2  
VK1688 已提交
137
		try {
VK1688's avatar
2.0.1  
VK1688 已提交
138
			if (aliyunOSS.groupUserId && typeof vk.getVuex === "function") {
VK1688's avatar
1.9.2  
VK1688 已提交
139
				let userInfo = vk.getVuex("$user.userInfo");
VK1688's avatar
2.0.1  
VK1688 已提交
140 141
				if (vk.pubfn.isNotNull(userInfo) && userInfo._id) {
					aliyunOSS.dirname += `/${userInfo._id}`;
VK1688's avatar
1.9.2  
VK1688 已提交
142 143
				}
			}
VK1688's avatar
2.0.1  
VK1688 已提交
144
		} catch (err) {}
VK1688's avatar
1.8.5  
VK1688 已提交
145
		configData = {
VK1688's avatar
2.0.1  
VK1688 已提交
146
			uploadData: {
VK1688's avatar
1.8.5  
VK1688 已提交
147 148 149
				OSSAccessKeyId: aliyunOSS.uploadData.OSSAccessKeyId,
				policy: aliyunOSS.uploadData.policy,
				signature: aliyunOSS.uploadData.signature,
VK1688's avatar
2.0.1  
VK1688 已提交
150 151
				success_action_status: 200,
				key: "test.png"
VK1688's avatar
1.8.5  
VK1688 已提交
152
			},
VK1688's avatar
2.0.1  
VK1688 已提交
153 154 155
			action: aliyunOSS.action,
			dirname: aliyunOSS.dirname,
			host: aliyunOSS.host,
VK1688's avatar
1.8.5  
VK1688 已提交
156 157 158 159 160
		};
	}
	return configData;
}
// 生成文件名
VK1688's avatar
2.0.1  
VK1688 已提交
161
function createFileName(obj = {}) {
VK1688's avatar
1.8.8  
VK1688 已提交
162
	let {
VK1688's avatar
1.8.9  
VK1688 已提交
163
		index = 0,
VK1688's avatar
2.0.1  
VK1688 已提交
164 165
			filePath,
			suffix = "png"
VK1688's avatar
1.8.8  
VK1688 已提交
166
	} = obj;
VK1688's avatar
1.8.5  
VK1688 已提交
167 168 169 170 171
	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 已提交
172

VK1688's avatar
2.0.1  
VK1688 已提交
173 174 175
	if (filePath) {
		let suffixName = filePath.substring(filePath.lastIndexOf(".") + 1);
		if (suffixName && suffixName.length < 5) suffix = suffixName;
VK1688's avatar
1.8.9  
VK1688 已提交
176 177
	}
	let oldName = index + "." + suffix;
VK1688's avatar
1.9.2  
VK1688 已提交
178

VK1688's avatar
1.8.5  
VK1688 已提交
179
	let date = new Date();
VK1688's avatar
2.0.1  
VK1688 已提交
180
	let dateYYYYMMDD = vk.pubfn.timeFormat(date, "yyyy/MM/dd");
VK1688's avatar
1.8.5  
VK1688 已提交
181 182
	let dateTime = date.getTime().toString(); // 时间戳
	// 时间戳后8位
VK1688's avatar
2.0.1  
VK1688 已提交
183
	let dateTimeEnd8 = dateTime.substring(dateTime.length - 8, dateTime.length);
VK1688's avatar
1.8.5  
VK1688 已提交
184 185 186
	let randomNumber = vk.pubfn.random(8); // 8位随机数
	// 文件路径 = 固定路径名 + 业务路径
	let servicePath = "";
VK1688's avatar
1.8.9  
VK1688 已提交
187
	let newFilePath = dirname + "/" + servicePath + dateYYYYMMDD + "/";
VK1688's avatar
1.8.5  
VK1688 已提交
188 189 190
	// 文件名 = 时间戳后8位 - 随机数8位 + 后缀名
	let fileNickName = dateTimeEnd8 + randomNumber + "-" + oldName;
	// 文件名全称(包含文件路径) = 外网域名 + 文件路径 + 文件名
VK1688's avatar
1.8.9  
VK1688 已提交
191
	let fileFullName = newFilePath + fileNickName;
VK1688's avatar
1.8.5  
VK1688 已提交
192
	// 外网地址 = 外网域名 + 文件路径 + 文件名
VK1688's avatar
2.0.1  
VK1688 已提交
193
	let url = host + "/" + fileFullName;
VK1688's avatar
1.8.5  
VK1688 已提交
194 195 196 197 198 199
	fileObj.url = url;
	fileObj.fileFullName = fileFullName;
	fileObj.fileNickName = fileNickName;
	return fileObj;
}

VK1688's avatar
2.0.1  
VK1688 已提交
200 201 202 203 204 205
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 已提交
206 207 208 209
	while (n--) {
		u8arr[n] = bstr.charCodeAt(n);
	}
	return new Blob([u8arr], { type: mime });
VK1688's avatar
1.8.8  
VK1688 已提交
210
}