From eadeccee20a547097a573f7aef30a61457a51d7b Mon Sep 17 00:00:00 2001 From: yujialong <479214531@qq.com> Date: Fri, 29 Mar 2024 15:12:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=A4=B4=E5=83=8F=E6=9B=B4?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E9=98=BF=E9=87=8C=E4=BA=91=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/Oss/base64.js | 135 ++++++++++++++++++++++++++++++++++++++++ libs/Oss/crypto.js | 117 ++++++++++++++++++++++++++++++++++ libs/Oss/hmac.js | 37 +++++++++++ libs/Oss/sha1.js | 82 ++++++++++++++++++++++++ libs/Oss/upload.js | 71 +++++++++++++++++++++ libs/util.js | 4 ++ pages/person/person.vue | 18 ++---- 7 files changed, 451 insertions(+), 13 deletions(-) create mode 100644 libs/Oss/base64.js create mode 100644 libs/Oss/crypto.js create mode 100644 libs/Oss/hmac.js create mode 100644 libs/Oss/sha1.js create mode 100644 libs/Oss/upload.js diff --git a/libs/Oss/base64.js b/libs/Oss/base64.js new file mode 100644 index 0000000..4535327 --- /dev/null +++ b/libs/Oss/base64.js @@ -0,0 +1,135 @@ +export const Base64 = { + + // private property + _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", + + // public method for encoding + encode : function (input) { + var output = ""; + var chr1, chr2, chr3, enc1, enc2, enc3, enc4; + var i = 0; + + input = Base64._utf8_encode(input); + + while (i < input.length) { + + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + + output = output + + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); + + } + + return output; + }, + + // public method for decoding + decode : function (input) { + var output = ""; + var chr1, chr2, chr3; + var enc1, enc2, enc3, enc4; + var i = 0; + + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + + while (i < input.length) { + + enc1 = this._keyStr.indexOf(input.charAt(i++)); + enc2 = this._keyStr.indexOf(input.charAt(i++)); + enc3 = this._keyStr.indexOf(input.charAt(i++)); + enc4 = this._keyStr.indexOf(input.charAt(i++)); + + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + + output = output + String.fromCharCode(chr1); + + if (enc3 != 64) { + output = output + String.fromCharCode(chr2); + } + if (enc4 != 64) { + output = output + String.fromCharCode(chr3); + } + + } + + output = Base64._utf8_decode(output); + + return output; + + }, + + // private method for UTF-8 encoding + _utf8_encode : function (string) { + string = string.replace(/\r\n/g,"\n"); + var utftext = ""; + + for (var n = 0; n < string.length; n++) { + + var c = string.charCodeAt(n); + + if (c < 128) { + utftext += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + + } + + return utftext; + }, + + // private method for UTF-8 decoding + _utf8_decode : function (utftext) { + var string = ""; + var i = 0; + var c = c1 = c2 = 0; + + while ( i < utftext.length ) { + + c = utftext.charCodeAt(i); + + if (c < 128) { + string += String.fromCharCode(c); + i++; + } + else if((c > 191) && (c < 224)) { + c2 = utftext.charCodeAt(i+1); + string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 2; + } + else { + c2 = utftext.charCodeAt(i+1); + c3 = utftext.charCodeAt(i+2); + string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + + } + + return string; + } + +} \ No newline at end of file diff --git a/libs/Oss/crypto.js b/libs/Oss/crypto.js new file mode 100644 index 0000000..7807ea4 --- /dev/null +++ b/libs/Oss/crypto.js @@ -0,0 +1,117 @@ +var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +let Crypto = {}; +var util = Crypto.util = { + rotl: function (n, b) { + return (n << b) | (n >>> (32 - b)); + }, + rotr: function (n, b) { + return (n << (32 - b)) | (n >>> b); + }, + endian: function (n) { + if (n.constructor == Number) { + return util.rotl(n, 8) & 0x00FF00FF | + util.rotl(n, 24) & 0xFF00FF00; + } + for (var i = 0; i < n.length; i++) + n[i] = util.endian(n[i]); + return n; + }, + randomBytes: function (n) { + for (var bytes = []; n > 0; n--) + bytes.push(Math.floor(Math.random() * 256)); + return bytes; + }, + stringToBytes: function (str) { + var bytes = []; + for (var i = 0; i < str.length; i++) + bytes.push(str.charCodeAt(i)); + return bytes; + }, + bytesToString: function (bytes) { + var str = []; + for (var i = 0; i < bytes.length; i++) + str.push(String.fromCharCode(bytes[i])); + return str.join(""); + }, + stringToWords: function (str) { + var words = []; + for (var c = 0, b = 0; c < str.length; c++, b += 8) + words[b >>> 5] |= str.charCodeAt(c) << (24 - b % 32); + return words; + }, + bytesToWords: function (bytes) { + var words = []; + for (var i = 0, b = 0; i < bytes.length; i++, b += 8) + words[b >>> 5] |= bytes[i] << (24 - b % 32); + return words; + }, + wordsToBytes: function (words) { + var bytes = []; + for (var b = 0; b < words.length * 32; b += 8) + bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF); + return bytes; + }, + bytesToHex: function (bytes) { + var hex = []; + for (var i = 0; i < bytes.length; i++) { + hex.push((bytes[i] >>> 4).toString(16)); + hex.push((bytes[i] & 0xF).toString(16)); + } + return hex.join(""); + }, + hexToBytes: function (hex) { + var bytes = []; + for (var c = 0; c < hex.length; c += 2) + bytes.push(parseInt(hex.substr(c, 2), 16)); + return bytes; + }, + bytesToBase64: function (bytes) { + if (typeof btoa == "function") return btoa(util.bytesToString(bytes)); + var base64 = [], + overflow; + for (var i = 0; i < bytes.length; i++) { + switch (i % 3) { + case 0: + base64.push(base64map.charAt(bytes[i] >>> 2)); + overflow = (bytes[i] & 0x3) << 4; + break; + case 1: + base64.push(base64map.charAt(overflow | (bytes[i] >>> 4))); + overflow = (bytes[i] & 0xF) << 2; + break; + case 2: + base64.push(base64map.charAt(overflow | (bytes[i] >>> 6))); + base64.push(base64map.charAt(bytes[i] & 0x3F)); + overflow = -1; + } + } + if (overflow != undefined && overflow != -1) + base64.push(base64map.charAt(overflow)); + while (base64.length % 4 != 0) base64.push("="); + return base64.join(""); + }, + base64ToBytes: function (base64) { + if (typeof atob == "function") return util.stringToBytes(atob(base64)); + base64 = base64.replace(/[^A-Z0-9+\/]/ig, ""); + var bytes = []; + for (var i = 0; i < base64.length; i++) { + switch (i % 4) { + case 1: + bytes.push((base64map.indexOf(base64.charAt(i - 1)) << 2) | + (base64map.indexOf(base64.charAt(i)) >>> 4)); + break; + case 2: + bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & 0xF) << 4) | + (base64map.indexOf(base64.charAt(i)) >>> 2)); + break; + case 3: + bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & 0x3) << 6) | + (base64map.indexOf(base64.charAt(i)))); + break; + } + } + return bytes; + } +}; +Crypto.mode = {}; +export default Crypto; \ No newline at end of file diff --git a/libs/Oss/hmac.js b/libs/Oss/hmac.js new file mode 100644 index 0000000..1918f4c --- /dev/null +++ b/libs/Oss/hmac.js @@ -0,0 +1,37 @@ +import Crypto from './crypto.js'; +/*! + * Crypto-JS v1.1.0 + * http://code.google.com/p/crypto-js/ + * Copyright (c) 2009, Jeff Mott. All rights reserved. + * http://code.google.com/p/crypto-js/wiki/License + */ +(function(){ + +// Shortcut +var util = Crypto.util; + +Crypto.HMAC = function (hasher, message, key, options) { + + // Allow arbitrary length keys + key = key.length > hasher._blocksize * 4 ? + hasher(key, { asBytes: true }) : + util.stringToBytes(key); + + // XOR keys with pad constants + var okey = key, + ikey = key.slice(0); + for (var i = 0; i < hasher._blocksize * 4; i++) { + okey[i] ^= 0x5C; + ikey[i] ^= 0x36; + } + + var hmacbytes = hasher(util.bytesToString(okey) + + hasher(util.bytesToString(ikey) + message, { asString: true }), + { asBytes: true }); + return options && options.asBytes ? hmacbytes : + options && options.asString ? util.bytesToString(hmacbytes) : + util.bytesToHex(hmacbytes); + +}; + +})(); \ No newline at end of file diff --git a/libs/Oss/sha1.js b/libs/Oss/sha1.js new file mode 100644 index 0000000..5632fd7 --- /dev/null +++ b/libs/Oss/sha1.js @@ -0,0 +1,82 @@ +import Crypto from './crypto.js'; +/*! + * Crypto-JS v1.1.0 + * http://code.google.com/p/crypto-js/ + * Copyright (c) 2009, Jeff Mott. All rights reserved. + * http://code.google.com/p/crypto-js/wiki/License + */ +(function(){ + +// Shortcut +var util = Crypto.util; + +// Public API +var SHA1 = Crypto.SHA1 = function (message, options) { + var digestbytes = util.wordsToBytes(SHA1._sha1(message)); + return options && options.asBytes ? digestbytes : + options && options.asString ? util.bytesToString(digestbytes) : + util.bytesToHex(digestbytes); +}; + +// The core +SHA1._sha1 = function (message) { + + var m = util.stringToWords(message), + l = message.length * 8, + w = [], + H0 = 1732584193, + H1 = -271733879, + H2 = -1732584194, + H3 = 271733878, + H4 = -1009589776; + + // Padding + m[l >> 5] |= 0x80 << (24 - l % 32); + m[((l + 64 >>> 9) << 4) + 15] = l; + + for (var i = 0; i < m.length; i += 16) { + + var a = H0, + b = H1, + c = H2, + d = H3, + e = H4; + + for (var j = 0; j < 80; j++) { + + if (j < 16) w[j] = m[i + j]; + else { + var n = w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16]; + w[j] = (n << 1) | (n >>> 31); + } + + var t = ((H0 << 5) | (H0 >>> 27)) + H4 + (w[j] >>> 0) + ( + j < 20 ? (H1 & H2 | ~H1 & H3) + 1518500249 : + j < 40 ? (H1 ^ H2 ^ H3) + 1859775393 : + j < 60 ? (H1 & H2 | H1 & H3 | H2 & H3) - 1894007588 : + (H1 ^ H2 ^ H3) - 899497514); + + H4 = H3; + H3 = H2; + H2 = (H1 << 30) | (H1 >>> 2); + H1 = H0; + H0 = t; + + } + + H0 += a; + H1 += b; + H2 += c; + H3 += d; + H4 += e; + + } + + return [H0, H1, H2, H3, H4]; + +}; + +// Package private blocksize +SHA1._blocksize = 16; + +})(); \ No newline at end of file diff --git a/libs/Oss/upload.js b/libs/Oss/upload.js new file mode 100644 index 0000000..a673826 --- /dev/null +++ b/libs/Oss/upload.js @@ -0,0 +1,71 @@ +import Crypto from './crypto.js'; +import './hmac.js'; +import './sha1.js'; +import Util from '@/libs/util' +import {Base64} from './base64.js'; + +let date=new Date() +date=date.setHours(date.getHours() + 24) +let extime=""+new Date(date).toISOString() +console.log(33, extime) +var policyText = { + "expiration": extime, //设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了 + "conditions": [ + ["content-length-range", 0, 1024*1024*100] // 设置上传文件的大小限制 + ] +}; +var config={ + accessid:'LTAI4FzqQHnk4rozqLZ8jCNj', + accesskey:'mveW7B1OyFoKUkHm8WsxmrjHmkJWHq', + osshost:'https://huoran.oss-cn-shenzhen.aliyuncs.com', + policyBase64:Base64.encode(JSON.stringify(policyText)) +} +var message = config.policyBase64; +var bytes = Crypto.HMAC(Crypto.SHA1, message, config.accesskey, { asBytes: true }) ; +var signature = Crypto.util.bytesToBase64(bytes); +var timetamp = new Date().getTime(); +function random_string(len) { +  len = len || 32; +  var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; +  var maxPos = chars.length; +  var pwd = ''; +  for (let i = 0; i < len; i++) { +   pwd += chars.charAt(Math.floor(Math.random() * maxPos)); + } + return pwd; +} +var OSS={ + name:'aliyun', + host:config.osshost, + accessid:config.accessid, + signature:signature, + policyBase64:config.policyBase64, +} +export default function(tempFilePaths, callback) { + const ext = Util.getFileExt(tempFilePaths) + const fileName = Date.now() + '.' + ext + uni.uploadFile({ +   url: OSS.host, +   filePath: tempFilePaths, + fileType: '', + name: 'file', + formData: { + name: fileName, + key: fileName,//文件名 +  policy: OSS.policyBase64, // 输入你获取的的policy + OSSAccessKeyId: OSS.accessid, // 输入你的AccessKeyId + success_action_status: '200', // 让服务端返回200,不然,默认会返回204 + signature: OSS.signature, // 输入你获取的的signature + }, + success: (res) => { + callback({ + name: fileName, + url: OSS.host + '/' + fileName, + ext + }) + }, + fail: (res) => { + console.log(res); + } +}) +}; \ No newline at end of file diff --git a/libs/util.js b/libs/util.js index 3d4b6fc..82c453c 100644 --- a/libs/util.js +++ b/libs/util.js @@ -121,4 +121,8 @@ export default { removeTag(str) { return str.replace(/(<[^>]+>)|(( )+)/g , '') }, + // 传入文件名获取文件后缀 + getFileExt(fileName) { + return fileName.substring(fileName.lastIndexOf(".") + 1); + }, } \ No newline at end of file diff --git a/pages/person/person.vue b/pages/person/person.vue index 9e621a3..c76f4e7 100644 --- a/pages/person/person.vue +++ b/pages/person/person.vue @@ -100,6 +100,7 @@ import { my, editProvinceCity } from '@/apis/modules/parner.js' import { queryProvince, queryCity, updateAvatars, getUserRolesPermissionMenu } from '@/apis/modules/user.js' import { getTeamsByAccountId } from '@/apis/modules/client.js' + import OSS from '@/libs/Oss/upload' export default { data() { return { @@ -247,19 +248,10 @@ }, // 上传头像回调 onChooseAvatar(e) { - uni.uploadFile({ - url: 'https://huorantech.cn/nakadai/nakadai/oss/fileUpload', - filePath: e.detail.avatarUrl, - name: 'file', - header: { - token: uni.getStorageSync('token'), - }, - formData: {}, - success: ({ data }) => { - updateAvatars(JSON.parse(data).filesResult.fileUrl).then(res => { - this.getInfo() - }).catch(e => {}) - } + OSS(e.detail.avatarUrl, ({ url }) => { + updateAvatars(url).then(res => { + this.getInfo() + }).catch(e => {}) }) }, // 创建自己的团队