Finished: Tencent COS v5 version

This commit is contained in:
Molunerfinn 2018-05-07 21:04:27 +08:00
parent 2496c0b467
commit 757a7d1260

View File

@ -12,6 +12,7 @@ const generateSignature = (fileName) => {
const appId = options.appId const appId = options.appId
const bucket = options.bucket const bucket = options.bucket
let signature let signature
let signTime
if (!options.version || options.version === 'v4') { if (!options.version || options.version === 'v4') {
const random = Math.floor(Math.random() * 10000000000) const random = Math.floor(Math.random() * 10000000000)
const current = parseInt(new Date().getTime() / 1000) - 1 const current = parseInt(new Date().getTime() / 1000) - 1
@ -23,9 +24,10 @@ const generateSignature = (fileName) => {
const tempString = Buffer.concat([signHexKey, Buffer.from(multiSignature)]) const tempString = Buffer.concat([signHexKey, Buffer.from(multiSignature)])
signature = Buffer.from(tempString).toString('base64') signature = Buffer.from(tempString).toString('base64')
} else { } else {
// https://cloud.tencent.com/document/product/436/7778#signature
const today = Math.floor(new Date().getTime() / 1000) const today = Math.floor(new Date().getTime() / 1000)
const tomorrow = today + 86400 const tomorrow = today + 86400
const signTime = `${today};${tomorrow}` signTime = `${today};${tomorrow}`
const signKey = crypto.createHmac('sha1', secretKey).update(signTime).digest('hex') const signKey = crypto.createHmac('sha1', secretKey).update(signTime).digest('hex')
const httpString = `put\n/${options.path}${fileName}\n\nhost=${options.bucket}.cos.${options.area}.myqcloud.com\n` const httpString = `put\n/${options.path}${fileName}\n\nhost=${options.bucket}.cos.${options.area}.myqcloud.com\n`
const sha1edHttpString = crypto.createHash('sha1').update(httpString).digest('hex') const sha1edHttpString = crypto.createHash('sha1').update(httpString).digest('hex')
@ -35,7 +37,8 @@ const generateSignature = (fileName) => {
return { return {
signature, signature,
appId, appId,
bucket bucket,
signTime
} }
} }
@ -43,7 +46,6 @@ const postOptions = (fileName, signature, imgBase64) => {
const options = db.read().get('picBed.tcyun').value() const options = db.read().get('picBed.tcyun').value()
const area = options.area const area = options.area
const path = options.path const path = options.path
console.log(options.verison)
if (!options.version || options.version === 'v4') { if (!options.version || options.version === 'v4') {
return { return {
method: 'POST', method: 'POST',
@ -64,13 +66,10 @@ const postOptions = (fileName, signature, imgBase64) => {
url: `http://${options.bucket}.cos.${options.area}.myqcloud.com/${path}${fileName}`, url: `http://${options.bucket}.cos.${options.area}.myqcloud.com/${path}${fileName}`,
headers: { headers: {
Host: `${options.bucket}.cos.${options.area}.myqcloud.com`, Host: `${options.bucket}.cos.${options.area}.myqcloud.com`,
Authorization: signature.signature, Authorization: `q-sign-algorithm=sha1&q-ak=${options.secretId}&q-sign-time=${signature.signTime}&q-key-time=${signature.signTime}&q-header-list=host&q-url-param-list=&q-signature=${signature.signature}`,
contentType: 'multipart/form-data' contentType: 'multipart/form-data'
}, },
formData: { body: Buffer.from(imgBase64, 'base64'),
op: 'upload',
filecontent: Buffer.from(imgBase64, 'base64')
},
resolveWithFullResponse: true resolveWithFullResponse: true
} }
} }
@ -85,15 +84,28 @@ const tcYunUpload = async (img, type, webContents) => {
const tcYunOptions = db.read().get('picBed.tcyun').value() const tcYunOptions = db.read().get('picBed.tcyun').value()
const customUrl = tcYunOptions.customUrl const customUrl = tcYunOptions.customUrl
const path = tcYunOptions.path const path = tcYunOptions.path
const useV4 = !tcYunOptions.version || tcYunOptions.version === 'v4'
for (let i in imgList) { for (let i in imgList) {
const singature = generateSignature(imgList[i].fileName) const singature = generateSignature(imgList[i].fileName)
const options = postOptions(imgList[i].fileName, singature, imgList[i].base64Image) const options = postOptions(imgList[i].fileName, singature, imgList[i].base64Image)
console.log(123, options)
const res = await request(options) const res = await request(options)
// const body = JSON.parse(res) .then(res => res)
const body = `${res}` .catch(err => {
console.log(body) console.log(err.response.body)
if (body.message === 'SUCCESS') { return {
statusCode: 400,
body: {
msg: '认证失败!'
}
}
})
let body
if (useV4) {
body = JSON.parse(res)
} else {
body = res
}
if (useV4 && body.message === 'SUCCESS') {
delete imgList[i].base64Image delete imgList[i].base64Image
if (customUrl) { if (customUrl) {
imgList[i]['imgUrl'] = `${customUrl}/${path}${imgList[i].fileName}` imgList[i]['imgUrl'] = `${customUrl}/${path}${imgList[i].fileName}`
@ -104,6 +116,17 @@ const tcYunUpload = async (img, type, webContents) => {
if (i - length === -1) { if (i - length === -1) {
webContents.send('uploadProgress', 60) webContents.send('uploadProgress', 60)
} }
} else if (!useV4 && body && body.statusCode === 200) {
delete imgList[i].base64Image
if (customUrl) {
imgList[i]['imgUrl'] = `${customUrl}/${path}${imgList[i].fileName}`
} else {
imgList[i]['imgUrl'] = `https://${tcYunOptions.bucket}.cos.${tcYunOptions.area}.myqcloud.com/${path}${imgList[i].fileName}`
}
imgList[i]['type'] = 'tcyun'
if (i - length === -1) {
webContents.send('uploadProgress', 60)
}
} else { } else {
webContents.send('uploadProgress', -1) webContents.send('uploadProgress', -1)
const notification = new Notification({ const notification = new Notification({
@ -111,6 +134,7 @@ const tcYunUpload = async (img, type, webContents) => {
body: res.body.msg body: res.body.msg
}) })
notification.show() notification.show()
return false
} }
} }
webContents.send('uploadProgress', 100) webContents.send('uploadProgress', 100)