aliyunOSSUtil.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /**
  2. * 阿里云oss工具类
  3. */
  4. var aliyunOSSUtil = {};
  5. var counterNum = 0;
  6. /**
  7. * 上传至阿里云oss
  8. vk.callFunctionUtil.uploadFile({
  9. filePath:tempFilePath,
  10. fileType:"image",
  11. provider:"aliyun",
  12. index,
  13. onUploadProgress:function(res){
  14. // 上传过程中
  15. if (res.progress > 0) {
  16. if(list[index]){
  17. list[index].progress = res.progress;
  18. }
  19. }
  20. },
  21. success:function(res){
  22. // 上传成功
  23. },
  24. fail:function(res){
  25. // 上传失败
  26. }
  27. });
  28. */
  29. aliyunOSSUtil.uploadFile = function(obj) {
  30. let {
  31. filePath,
  32. fileType = "image",
  33. name = "file",
  34. header = {
  35. "x-oss-forbid-overwrite": true,
  36. },
  37. index = 0,
  38. file = {},
  39. needSave = false,
  40. category_id,
  41. title,
  42. } = obj;
  43. let vk = getApp().globalData.vk;
  44. if (title) vk.showLoading(title);
  45. let fileNameObj = createFileName(obj);
  46. let aliyunOSS = getConfig();
  47. let fileName = fileNameObj.fileFullName;
  48. let formData = vk.pubfn.copyObject(aliyunOSS.uploadData);
  49. formData["key"] = fileName; // 存储在oss的文件路径
  50. /**
  51. * 特别说明
  52. * 若已知本地图片,则使用formData["name"] = filePath
  53. * 若已知base64,则是用formData["file"] = file;// file base64字符串转成blob对象
  54. */
  55. if (filePath.indexOf(";base64,") > -1) {
  56. formData["file"] = dataURLtoBlob(filePath);
  57. } else {
  58. formData["name"] = filePath;
  59. }
  60. let Logger = {};
  61. Logger.startTime = new Date().getTime();
  62. Logger.filePath = filePath;
  63. return new Promise((resolve, reject) => {
  64. let uploadTask = uni.uploadFile({
  65. url: aliyunOSS.action,
  66. filePath,
  67. name,
  68. header,
  69. formData: formData,
  70. success: function(res) {
  71. if (title) vk.hideLoading();
  72. if (![200, 201].includes(res.statusCode)) {
  73. if (typeof obj.fail === "function") obj.fail(res);
  74. Logger.error = res;
  75. } else {
  76. // 上传成功
  77. res.fileID = fileNameObj.url;
  78. Logger.result = res;
  79. if (typeof obj.success === "function") obj.success(res);
  80. resolve(res);
  81. if (needSave) {
  82. // 保存文件记录到数据库
  83. vk.userCenter.addUploadRecord({
  84. data: {
  85. url: res.fileID,
  86. name: file.name,
  87. size: file.size,
  88. file_id: res.fileID,
  89. provider: "aliyun",
  90. category_id
  91. },
  92. filePath,
  93. fileType,
  94. success: function() {
  95. if (typeof obj.addSuccess == "function") obj.addSuccess(res);
  96. },
  97. fail: function(res) {
  98. if (typeof obj.addFail === "function") obj.addFail(res);
  99. }
  100. });
  101. }
  102. }
  103. },
  104. fail: function(res) {
  105. if (title) vk.hideLoading();
  106. Logger.error = res;
  107. if (res.errMsg && res.errMsg.indexOf('fail url not in domain list') > -1) {
  108. vk.toast('上传域名未在白名单中');
  109. }
  110. if (typeof obj.fail === "function") obj.fail(res);
  111. },
  112. complete: function() {
  113. let vk = getApp().globalData.vk;
  114. let config = vk.callFunctionUtil.config;
  115. if (config.debug) {
  116. Logger.endTime = new Date().getTime();
  117. Logger.runTime = (Logger.endTime - Logger.startTime);
  118. let colorArr = config.logger.colorArr;
  119. let colorStr = colorArr[counterNum % colorArr.length];
  120. counterNum++;
  121. console.log("%c--------【开始】【阿里云oss文件上传】--------", 'color: ' + colorStr + ';font-size: 12px;font-weight: bold;');
  122. console.log("【本地文件】: ", Logger.filePath);
  123. console.log("【返回数据】: ", Logger.result);
  124. console.log("【预览地址】: ", Logger.result.fileID);
  125. console.log("【上传耗时】: ", Logger.runTime, "毫秒");
  126. console.log("【上传时间】: ", vk.pubfn.timeFormat(Logger.startTime, "yyyy-MM-dd hh:mm:ss"));
  127. if (Logger.error) console.error("【error】:", Logger.error);
  128. console.log("%c--------【结束】【阿里云oss文件上传】--------", 'color: ' + colorStr + ';font-size: 12px;font-weight: bold;');
  129. }
  130. }
  131. });
  132. uploadTask.onProgressUpdate((res) => {
  133. if (res.progress > 0) {
  134. if (typeof obj.onUploadProgress === "function") obj.onUploadProgress(res);
  135. }
  136. });
  137. });
  138. };
  139. export default aliyunOSSUtil;
  140. // 获取配置
  141. function getConfig() {
  142. let vk = getApp().globalData.vk;
  143. let config = vk.callFunctionUtil.getConfig();
  144. let aliyunOSS = vk.pubfn.getData(config, "service.aliyunOSS");
  145. let configData = {};
  146. if (aliyunOSS && aliyunOSS.uploadData && aliyunOSS.uploadData.OSSAccessKeyId) {
  147. try {
  148. if (aliyunOSS.groupUserId && typeof vk.getVuex === "function") {
  149. let userInfo = vk.getVuex("$user.userInfo");
  150. if (vk.pubfn.isNotNull(userInfo) && userInfo._id) {
  151. aliyunOSS.dirname += `/${userInfo._id}`;
  152. }
  153. }
  154. } catch (err) {}
  155. configData = {
  156. uploadData: {
  157. OSSAccessKeyId: aliyunOSS.uploadData.OSSAccessKeyId,
  158. policy: aliyunOSS.uploadData.policy,
  159. signature: aliyunOSS.uploadData.signature,
  160. success_action_status: 200,
  161. key: "test.png"
  162. },
  163. action: aliyunOSS.action,
  164. dirname: aliyunOSS.dirname,
  165. host: aliyunOSS.host,
  166. };
  167. }
  168. return configData;
  169. }
  170. // 生成文件名
  171. function createFileName(obj = {}) {
  172. let {
  173. index = 0,
  174. file,
  175. filePath,
  176. } = obj;
  177. let vk = getApp().globalData.vk;
  178. let aliyunOSS = getConfig();
  179. let dirname = aliyunOSS.dirname;
  180. let host = aliyunOSS.host;
  181. let fileObj = {};
  182. let suffix = getFileSuffix(obj);
  183. let oldName = index + "." + suffix;
  184. if (file && file.name) {
  185. let suffixName = file.name.substring(file.name.lastIndexOf(".") + 1);
  186. if (suffixName && suffixName.length < 5) oldName = file.name;
  187. // 只保留["数字","英文",".","-"]
  188. oldName = oldName.replace(/[^a-zA-Z.-d]/g, '');
  189. if (oldName.indexOf(".") == 0) oldName = "0" + oldName;
  190. }
  191. let date = new Date();
  192. let dateYYYYMMDD = vk.pubfn.timeFormat(date, "yyyy/MM/dd");
  193. let dateTime = date.getTime().toString(); // 时间戳
  194. // 时间戳后8位
  195. let dateTimeEnd8 = dateTime.substring(dateTime.length - 8, dateTime.length);
  196. let randomNumber = vk.pubfn.random(8); // 8位随机数
  197. // 文件路径 = 固定路径名 + 业务路径
  198. let servicePath = "";
  199. let newFilePath = dirname + "/" + servicePath + dateYYYYMMDD + "/";
  200. // 文件名 = 时间戳后8位 - 随机数8位 + 后缀名
  201. let fileNickName = dateTimeEnd8 + randomNumber + "-" + oldName;
  202. // 文件名全称(包含文件路径) = 外网域名 + 文件路径 + 文件名
  203. let fileFullName = newFilePath + fileNickName;
  204. // 外网地址 = 外网域名 + 文件路径 + 文件名
  205. let url = host + "/" + fileFullName;
  206. fileObj.url = url;
  207. fileObj.fileFullName = fileFullName;
  208. fileObj.fileNickName = fileNickName;
  209. return fileObj;
  210. }
  211. function getFileSuffix(obj = {}) {
  212. let {
  213. file,
  214. filePath
  215. } = obj;
  216. let suffix = "png";
  217. if (filePath) {
  218. let suffixName = filePath.substring(filePath.lastIndexOf(".") + 1);
  219. if (suffixName && suffixName.length < 5) suffix = suffixName;
  220. }
  221. if (file) {
  222. if (file.path) {
  223. let suffixName = file.path.substring(file.path.lastIndexOf(".") + 1);
  224. if (suffixName && suffixName.length < 5) suffix = suffixName;
  225. }
  226. if (file.name) {
  227. let suffixName = file.name.substring(file.name.lastIndexOf(".") + 1);
  228. if (suffixName && suffixName.length < 5) suffix = suffixName;
  229. }
  230. }
  231. return suffix;
  232. }
  233. function dataURLtoBlob(dataurl) {
  234. let arr = dataurl.split(','),
  235. mime = arr[0].match(/:(.*?);/)[1],
  236. bstr = atob(arr[1]),
  237. n = bstr.length,
  238. u8arr = new Uint8Array(n);
  239. while (n--) {
  240. u8arr[n] = bstr.charCodeAt(n);
  241. }
  242. return new Blob([u8arr], { type: mime });
  243. }