mirror of
https://github.com/Kuingsmile/PicList.git
synced 2026-05-12 11:30:27 +08:00
Updated: home page webpack config
This commit is contained in:
@@ -359,6 +359,7 @@ const uploadClipboardFiles = async () => {
|
||||
|
||||
picgoCoreIPC(app, ipcMain)
|
||||
|
||||
// from macOS tray
|
||||
ipcMain.on('uploadClipboardFiles', async (evt, file) => {
|
||||
const img = await new Uploader(file, 'imgFromClipboard', window.webContents).upload()
|
||||
if (img !== false) {
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
import request from 'request-promise'
|
||||
import * as img2Base64 from './img2base64'
|
||||
import db from '../../datastore/index'
|
||||
import { Notification } from 'electron'
|
||||
import crypto from 'crypto'
|
||||
import mime from 'mime-types'
|
||||
|
||||
// generate OSS signature
|
||||
const generateSignature = (fileName) => {
|
||||
const options = db.read().get('picBed.aliyun').value()
|
||||
const date = new Date().toGMTString()
|
||||
const signString = `PUT\n\n${mime.lookup(fileName)}\n${date}\n/${options.bucket}/${options.path}${fileName}`
|
||||
|
||||
const signature = crypto.createHmac('sha1', options.accessKeySecret).update(signString).digest('base64')
|
||||
return `OSS ${options.accessKeyId}:${signature}`
|
||||
}
|
||||
|
||||
const postOptions = (fileName, signature, imgBase64) => {
|
||||
const options = db.read().get('picBed.aliyun').value()
|
||||
return {
|
||||
method: 'PUT',
|
||||
url: `https://${options.bucket}.${options.area}.aliyuncs.com/${encodeURI(options.path)}${encodeURI(fileName)}`,
|
||||
headers: {
|
||||
Host: `${options.bucket}.${options.area}.aliyuncs.com`,
|
||||
Authorization: signature,
|
||||
Date: new Date().toGMTString(),
|
||||
'content-type': mime.lookup(fileName)
|
||||
},
|
||||
body: Buffer.from(imgBase64, 'base64'),
|
||||
resolveWithFullResponse: true
|
||||
}
|
||||
}
|
||||
|
||||
const aliYunUpload = async (img, type, webContents) => {
|
||||
try {
|
||||
webContents.send('uploadProgress', 0)
|
||||
const imgList = await img2Base64[type](img)
|
||||
webContents.send('uploadProgress', 30)
|
||||
const aliYunOptions = db.read().get('picBed.aliyun').value()
|
||||
const customUrl = aliYunOptions.customUrl
|
||||
const path = aliYunOptions.path
|
||||
const length = imgList.length
|
||||
for (let i in imgList) {
|
||||
const signature = generateSignature(imgList[i].fileName)
|
||||
const options = postOptions(imgList[i].fileName, signature, imgList[i].base64Image)
|
||||
let body = await request(options)
|
||||
if (body.statusCode === 200) {
|
||||
delete imgList[i].base64Image
|
||||
if (customUrl) {
|
||||
imgList[i]['imgUrl'] = `${customUrl}/${path}${imgList[i].fileName}`
|
||||
} else {
|
||||
imgList[i]['imgUrl'] = `https://${aliYunOptions.bucket}.${aliYunOptions.area}.aliyuncs.com/${path}${imgList[i].fileName}`
|
||||
}
|
||||
imgList[i]['type'] = 'aliyun'
|
||||
if (i - length === -1) {
|
||||
webContents.send('uploadProgress', 60)
|
||||
}
|
||||
} else {
|
||||
webContents.send('uploadProgress', -1)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: '上传失败!'
|
||||
})
|
||||
notification.show()
|
||||
return false
|
||||
}
|
||||
}
|
||||
webContents.send('uploadProgress', 100)
|
||||
return imgList
|
||||
} catch (err) {
|
||||
webContents.send('uploadProgress', -1)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: `请检查你的配置项是否正确`
|
||||
})
|
||||
notification.show()
|
||||
throw new Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
export default aliYunUpload
|
||||
@@ -1,66 +0,0 @@
|
||||
import request from 'request-promise'
|
||||
import * as img2Base64 from './img2base64'
|
||||
import db from '../../datastore/index'
|
||||
import { Notification } from 'electron'
|
||||
|
||||
const postOptions = (fileName, options, data) => {
|
||||
const path = options.path || ''
|
||||
const {token, repo} = options
|
||||
return {
|
||||
method: 'PUT',
|
||||
url: `https://api.github.com/repos/${repo}/contents/${encodeURI(path)}${encodeURI(fileName)}`,
|
||||
headers: {
|
||||
Authorization: `token ${token}`,
|
||||
'User-Agent': 'PicGo'
|
||||
},
|
||||
body: data,
|
||||
json: true
|
||||
}
|
||||
}
|
||||
|
||||
const githubUpload = async function (img, type, webContents) {
|
||||
try {
|
||||
webContents.send('uploadProgress', 0)
|
||||
const imgList = await img2Base64[type](img)
|
||||
const length = imgList.length
|
||||
const githubOptions = db.read().get('picBed.github').value()
|
||||
webContents.send('uploadProgress', 30)
|
||||
for (let i in imgList) {
|
||||
const data = {
|
||||
message: 'Upload by PicGo',
|
||||
branch: githubOptions.branch,
|
||||
content: imgList[i].base64Image,
|
||||
path: githubOptions.path + encodeURI(imgList[i].fileName)
|
||||
}
|
||||
const postConfig = postOptions(imgList[i].fileName, githubOptions, data)
|
||||
const body = await request(postConfig)
|
||||
if (body) {
|
||||
delete imgList[i].base64Image
|
||||
if (githubOptions.customUrl) {
|
||||
imgList[i]['imgUrl'] = `${githubOptions.customUrl}/${githubOptions.path}${imgList[i].fileName}`
|
||||
} else {
|
||||
imgList[i]['imgUrl'] = body.content.download_url
|
||||
}
|
||||
imgList[i]['type'] = 'github'
|
||||
if (i - length === -1) {
|
||||
webContents.send('uploadProgress', 60)
|
||||
}
|
||||
} else {
|
||||
webContents.send('uploadProgress', -1)
|
||||
return new Error()
|
||||
}
|
||||
}
|
||||
webContents.send('uploadProgress', 100)
|
||||
return imgList
|
||||
} catch (err) {
|
||||
webContents.send('uploadProgress', -1)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: '服务端出错,请重试'
|
||||
})
|
||||
notification.show()
|
||||
throw new Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
export default githubUpload
|
||||
@@ -1,146 +0,0 @@
|
||||
import fs from 'fs-extra'
|
||||
import path from 'path'
|
||||
import sizeOf from 'image-size'
|
||||
import fecha from 'fecha'
|
||||
import { BrowserWindow, ipcMain } from 'electron'
|
||||
import db from '../../datastore/index.js'
|
||||
const renameURL = process.env.NODE_ENV === 'development' ? `http://localhost:9080/#rename-page` : `file://${__dirname}/index.html#rename-page`
|
||||
|
||||
const createRenameWindow = () => {
|
||||
let options = {
|
||||
height: 175,
|
||||
width: 300,
|
||||
show: true,
|
||||
fullscreenable: false,
|
||||
resizable: false,
|
||||
vibrancy: 'ultra-dark',
|
||||
webPreferences: {
|
||||
backgroundThrottling: false
|
||||
}
|
||||
}
|
||||
|
||||
if (process.platform !== 'darwin') {
|
||||
options.show = true
|
||||
options.backgroundColor = '#3f3c37'
|
||||
options.autoHideMenuBar = true
|
||||
options.transparent = false
|
||||
}
|
||||
|
||||
const window = new BrowserWindow(options)
|
||||
window.loadURL(renameURL)
|
||||
return window
|
||||
}
|
||||
|
||||
const imgFromPath = async (imgPath) => {
|
||||
let results = []
|
||||
const rename = db.read().get('picBed.rename').value()
|
||||
const autoRename = db.read().get('picBed.autoRename').value()
|
||||
await Promise.all(imgPath.map(async item => {
|
||||
let name
|
||||
let fileName
|
||||
if (autoRename) {
|
||||
fileName = fecha.format(new Date(), 'YYYYMMDDHHmmss') + path.extname(item)
|
||||
} else {
|
||||
fileName = path.basename(item)
|
||||
}
|
||||
if (rename) {
|
||||
const window = createRenameWindow()
|
||||
await waitForShow(window.webContents)
|
||||
window.webContents.send('rename', fileName, window.webContents.id)
|
||||
name = await waitForRename(window, window.webContents.id)
|
||||
}
|
||||
let buffer = await fs.readFile(item)
|
||||
let base64Image = Buffer.from(buffer).toString('base64')
|
||||
let imgSize = sizeOf(item)
|
||||
results.push({
|
||||
base64Image,
|
||||
fileName: name || fileName,
|
||||
width: imgSize.width,
|
||||
height: imgSize.height,
|
||||
extname: path.extname(item)
|
||||
})
|
||||
}))
|
||||
return results
|
||||
}
|
||||
|
||||
const imgFromClipboard = async (file) => {
|
||||
let result = []
|
||||
let rename = db.read().get('picBed.rename').value()
|
||||
if (file !== null) {
|
||||
let name
|
||||
const today = fecha.format(new Date(), 'YYYYMMDDHHmmss') + '.png'
|
||||
if (rename) {
|
||||
const window = createRenameWindow()
|
||||
await waitForShow(window.webContents)
|
||||
window.webContents.send('rename', today, window.webContents.id)
|
||||
name = await waitForRename(window, window.webContents.id)
|
||||
}
|
||||
result.push({
|
||||
base64Image: file.imgUrl.replace(/^data\S+,/, ''),
|
||||
fileName: name || today,
|
||||
width: file.width,
|
||||
height: file.height,
|
||||
extname: '.png'
|
||||
})
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
const imgFromUploader = async (files) => {
|
||||
let results = []
|
||||
const rename = db.read().get('picBed.rename').value()
|
||||
const autoRename = db.read().get('picBed.autoRename').value()
|
||||
await Promise.all(files.map(async item => {
|
||||
let name
|
||||
let fileName
|
||||
if (autoRename) {
|
||||
fileName = fecha.format(new Date(), 'YYYYMMDDHHmmss') + path.extname(item.name)
|
||||
} else {
|
||||
fileName = path.basename(item.path)
|
||||
}
|
||||
if (rename) {
|
||||
const window = createRenameWindow()
|
||||
await waitForShow(window.webContents)
|
||||
window.webContents.send('rename', fileName, window.webContents.id)
|
||||
name = await waitForRename(window, window.webContents.id)
|
||||
}
|
||||
let buffer = await fs.readFile(item.path)
|
||||
let base64Image = Buffer.from(buffer).toString('base64')
|
||||
let imgSize = sizeOf(item.path)
|
||||
results.push({
|
||||
base64Image,
|
||||
fileName: name || fileName,
|
||||
width: imgSize.width,
|
||||
height: imgSize.height,
|
||||
extname: path.extname(item.name)
|
||||
})
|
||||
}))
|
||||
return results
|
||||
}
|
||||
|
||||
const waitForShow = (webcontent) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
webcontent.on('dom-ready', () => {
|
||||
resolve()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
const waitForRename = (window, id) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
ipcMain.once(`rename${id}`, (evt, newName) => {
|
||||
resolve(newName)
|
||||
window.hide()
|
||||
})
|
||||
window.on('close', () => {
|
||||
resolve(null)
|
||||
ipcMain.removeAllListeners(`rename${id}`)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
export {
|
||||
imgFromPath,
|
||||
imgFromClipboard,
|
||||
imgFromUploader
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
import request from 'request-promise'
|
||||
import * as img2Base64 from './img2base64'
|
||||
import db from '../../datastore/index'
|
||||
import { Notification, clipboard } from 'electron'
|
||||
|
||||
const postOptions = (fileName, imgBase64) => {
|
||||
const options = db.read().get('picBed.imgur').value()
|
||||
const clientId = options.clientId
|
||||
let obj = {
|
||||
method: 'POST',
|
||||
url: `https://api.imgur.com/3/image`,
|
||||
headers: {
|
||||
Authorization: 'Client-ID ' + clientId,
|
||||
'content-type': 'multipart/form-data',
|
||||
'User-Agent': 'PicGo'
|
||||
},
|
||||
formData: {
|
||||
image: imgBase64,
|
||||
type: 'base64',
|
||||
name: fileName
|
||||
}
|
||||
}
|
||||
if (options.proxy) {
|
||||
obj.proxy = options.proxy
|
||||
}
|
||||
return obj
|
||||
}
|
||||
|
||||
const imgurUpload = async (img, type, webContents) => {
|
||||
try {
|
||||
webContents.send('uploadProgress', 0)
|
||||
const imgList = await img2Base64[type](img)
|
||||
webContents.send('uploadProgress', 30)
|
||||
const length = imgList.length
|
||||
for (let i in imgList) {
|
||||
const options = postOptions(imgList[i].fileName, imgList[i].base64Image)
|
||||
let body = await request(options)
|
||||
body = JSON.parse(body)
|
||||
if (body.success) {
|
||||
delete imgList[i].base64Image
|
||||
imgList[i]['imgUrl'] = `${body.data.link}`
|
||||
imgList[i]['type'] = 'imgur'
|
||||
if (i - length === -1) {
|
||||
webContents.send('uploadProgress', 60)
|
||||
}
|
||||
} else {
|
||||
webContents.send('uploadProgress', -1)
|
||||
return new Error()
|
||||
}
|
||||
}
|
||||
webContents.send('uploadProgress', 100)
|
||||
return imgList
|
||||
} catch (err) {
|
||||
webContents.send('uploadProgress', -1)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: `请检查你的配置以及网络!`
|
||||
})
|
||||
notification.show()
|
||||
clipboard.writeText('http://docs.imgur.com/api/errno/')
|
||||
throw new Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
export default imgurUpload
|
||||
@@ -1,79 +0,0 @@
|
||||
import request from 'request-promise'
|
||||
import * as img2Base64 from './img2base64'
|
||||
import db from '../../datastore/index'
|
||||
import * as qiniu from 'qiniu'
|
||||
import { Notification } from 'electron'
|
||||
|
||||
function postOptions (fileName, token, imgBase64) {
|
||||
const area = selectArea(db.read().get('picBed.qiniu.area').value() || 'z0')
|
||||
const path = db.read().get('picBed.qiniu.path').value() || ''
|
||||
const base64FileName = Buffer.from(path + fileName, 'utf-8').toString('base64').replace(/\+/g, '-').replace(/\//g, '_')
|
||||
return {
|
||||
method: 'POST',
|
||||
url: `http://upload${area}.qiniu.com/putb64/-1/key/${base64FileName}`,
|
||||
headers: {
|
||||
Authorization: `UpToken ${token}`,
|
||||
contentType: 'application/octet-stream'
|
||||
},
|
||||
body: imgBase64
|
||||
}
|
||||
}
|
||||
|
||||
function selectArea (area) {
|
||||
return area === 'z0' ? '' : '-' + area
|
||||
}
|
||||
|
||||
function getToken () {
|
||||
const accessKey = db.read().get('picBed.qiniu.accessKey').value()
|
||||
const secretKey = db.read().get('picBed.qiniu.secretKey').value()
|
||||
const mac = new qiniu.auth.digest.Mac(accessKey, secretKey)
|
||||
const options = {
|
||||
scope: db.read().get('picBed.qiniu.bucket').value()
|
||||
}
|
||||
const putPolicy = new qiniu.rs.PutPolicy(options)
|
||||
return putPolicy.uploadToken(mac)
|
||||
}
|
||||
|
||||
const qiniuUpload = async function (img, type, webContents) {
|
||||
try {
|
||||
webContents.send('uploadProgress', 0)
|
||||
const imgList = await img2Base64[type](img)
|
||||
webContents.send('uploadProgress', 30)
|
||||
const length = imgList.length
|
||||
for (let i in imgList) {
|
||||
const options = postOptions(imgList[i].fileName, getToken(), imgList[i].base64Image)
|
||||
const res = await request(options)
|
||||
const body = JSON.parse(res)
|
||||
if (body.key) {
|
||||
delete imgList[i].base64Image
|
||||
const baseUrl = db.get('picBed.qiniu.url').value()
|
||||
const options = db.get('picBed.qiniu.options').value()
|
||||
imgList[i]['imgUrl'] = `${baseUrl}/${body.key}${options}`
|
||||
imgList[i]['type'] = 'qiniu'
|
||||
if (i - length === -1) {
|
||||
webContents.send('uploadProgress', 60)
|
||||
}
|
||||
} else {
|
||||
webContents.send('uploadProgress', -1)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: res.body.msg
|
||||
})
|
||||
notification.show()
|
||||
}
|
||||
}
|
||||
webContents.send('uploadProgress', 100)
|
||||
return imgList
|
||||
} catch (err) {
|
||||
webContents.send('uploadProgress', -1)
|
||||
const error = JSON.parse(err.response.body)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: error.error
|
||||
})
|
||||
notification.show()
|
||||
throw new Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
export default qiniuUpload
|
||||
@@ -1,56 +0,0 @@
|
||||
import request from 'request-promise'
|
||||
import * as img2Base64 from './img2base64'
|
||||
import { Notification } from 'electron'
|
||||
|
||||
const postOptions = (fileName, imgBase64) => {
|
||||
return {
|
||||
method: 'POST',
|
||||
url: `https://sm.ms/api/upload`,
|
||||
headers: {
|
||||
contentType: 'multipart/form-data',
|
||||
'User-Agent': 'PicGo'
|
||||
},
|
||||
formData: {
|
||||
smfile: {
|
||||
value: Buffer.from(imgBase64, 'base64'),
|
||||
options: {
|
||||
filename: fileName
|
||||
}
|
||||
},
|
||||
ssl: 'true'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const smmsUpload = async function (img, type, webContents) {
|
||||
try {
|
||||
webContents.send('uploadProgress', 0)
|
||||
const imgList = await img2Base64[type](img)
|
||||
webContents.send('uploadProgress', 30)
|
||||
for (let i in imgList) {
|
||||
const postConfig = postOptions(imgList[i].fileName, imgList[i].base64Image)
|
||||
let body = await request(postConfig)
|
||||
body = JSON.parse(body)
|
||||
if (body.code === 'success') {
|
||||
delete imgList[i].base64Image
|
||||
imgList[i]['imgUrl'] = body.data.url
|
||||
imgList[i]['type'] = 'smms'
|
||||
} else {
|
||||
webContents.send('uploadProgress', -1)
|
||||
return new Error()
|
||||
}
|
||||
}
|
||||
webContents.send('uploadProgress', 100)
|
||||
return imgList
|
||||
} catch (err) {
|
||||
webContents.send('uploadProgress', -1)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: '服务端出错,请重试'
|
||||
})
|
||||
notification.show()
|
||||
throw new Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
export default smmsUpload
|
||||
@@ -1,166 +0,0 @@
|
||||
import request from 'request-promise'
|
||||
import * as img2Base64 from './img2base64'
|
||||
import db from '../../datastore/index'
|
||||
import { Notification, clipboard } from 'electron'
|
||||
import crypto from 'crypto'
|
||||
import mime from 'mime-types'
|
||||
|
||||
// generate COS signature string
|
||||
const generateSignature = (fileName) => {
|
||||
const options = db.read().get('picBed.tcyun').value()
|
||||
const secretId = options.secretId
|
||||
const secretKey = options.secretKey
|
||||
const appId = options.appId
|
||||
const bucket = options.bucket
|
||||
let signature
|
||||
let signTime
|
||||
if (!options.version || options.version === 'v4') {
|
||||
const random = Math.floor(Math.random() * 10000000000)
|
||||
const current = parseInt(new Date().getTime() / 1000) - 1
|
||||
const expired = current + 3600
|
||||
|
||||
const multiSignature = `a=${appId}&b=${bucket}&k=${secretId}&e=${expired}&t=${current}&r=${random}&f=`
|
||||
|
||||
const signHexKey = crypto.createHmac('sha1', secretKey).update(multiSignature).digest()
|
||||
const tempString = Buffer.concat([signHexKey, Buffer.from(multiSignature)])
|
||||
signature = Buffer.from(tempString).toString('base64')
|
||||
} else {
|
||||
// https://cloud.tencent.com/document/product/436/7778#signature
|
||||
const today = Math.floor(new Date().getTime() / 1000)
|
||||
const tomorrow = today + 86400
|
||||
signTime = `${today};${tomorrow}`
|
||||
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 sha1edHttpString = crypto.createHash('sha1').update(httpString).digest('hex')
|
||||
const stringToSign = `sha1\n${signTime}\n${sha1edHttpString}\n`
|
||||
signature = crypto.createHmac('sha1', signKey).update(stringToSign).digest('hex')
|
||||
}
|
||||
return {
|
||||
signature,
|
||||
appId,
|
||||
bucket,
|
||||
signTime
|
||||
}
|
||||
}
|
||||
|
||||
const postOptions = (fileName, signature, imgBase64) => {
|
||||
const options = db.read().get('picBed.tcyun').value()
|
||||
const area = options.area
|
||||
const path = options.path
|
||||
if (!options.version || options.version === 'v4') {
|
||||
return {
|
||||
method: 'POST',
|
||||
url: `http://${area}.file.myqcloud.com/files/v2/${signature.appId}/${signature.bucket}/${encodeURI(path)}${fileName}`,
|
||||
headers: {
|
||||
Host: `${area}.file.myqcloud.com`,
|
||||
Authorization: signature.signature,
|
||||
contentType: 'multipart/form-data'
|
||||
},
|
||||
formData: {
|
||||
op: 'upload',
|
||||
filecontent: Buffer.from(imgBase64, 'base64')
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
method: 'PUT',
|
||||
url: `http://${options.bucket}.cos.${options.area}.myqcloud.com/${encodeURI(path)}${encodeURI(fileName)}`,
|
||||
headers: {
|
||||
Host: `${options.bucket}.cos.${options.area}.myqcloud.com`,
|
||||
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: mime.lookup(fileName)
|
||||
},
|
||||
body: Buffer.from(imgBase64, 'base64'),
|
||||
resolveWithFullResponse: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const tcYunUpload = async (img, type, webContents) => {
|
||||
try {
|
||||
webContents.send('uploadProgress', 0)
|
||||
const imgList = await img2Base64[type](img)
|
||||
webContents.send('uploadProgress', 30)
|
||||
const length = imgList.length
|
||||
const tcYunOptions = db.read().get('picBed.tcyun').value()
|
||||
const customUrl = tcYunOptions.customUrl
|
||||
const path = tcYunOptions.path
|
||||
const useV4 = !tcYunOptions.version || tcYunOptions.version === 'v4'
|
||||
for (let i in imgList) {
|
||||
const signature = generateSignature(imgList[i].fileName)
|
||||
const options = postOptions(imgList[i].fileName, signature, imgList[i].base64Image)
|
||||
const res = await request(options)
|
||||
.then(res => res)
|
||||
.catch(err => {
|
||||
console.log(err.response.body)
|
||||
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
|
||||
if (customUrl) {
|
||||
imgList[i]['imgUrl'] = `${customUrl}/${path}${imgList[i].fileName}`
|
||||
} else {
|
||||
imgList[i]['imgUrl'] = body.data.source_url
|
||||
}
|
||||
imgList[i]['type'] = 'tcyun'
|
||||
if (i - length === -1) {
|
||||
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 {
|
||||
webContents.send('uploadProgress', -1)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: res.body.msg
|
||||
})
|
||||
notification.show()
|
||||
return false
|
||||
}
|
||||
}
|
||||
webContents.send('uploadProgress', 100)
|
||||
return imgList
|
||||
} catch (err) {
|
||||
const options = db.read().get('picBed.tcyun').value()
|
||||
let body
|
||||
if (!options.version || options.version === 'v4') {
|
||||
body = JSON.parse(err.error)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: `错误码:${body.code},请打开浏览器粘贴地址查看相关原因。`
|
||||
})
|
||||
notification.show()
|
||||
clipboard.writeText('https://cloud.tencent.com/document/product/436/8432')
|
||||
} else {
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: `请检查你的配置项是否正确`
|
||||
})
|
||||
notification.show()
|
||||
}
|
||||
webContents.send('uploadProgress', -1)
|
||||
throw new Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
export default tcYunUpload
|
||||
@@ -1,78 +0,0 @@
|
||||
import request from 'request-promise'
|
||||
import * as img2Base64 from './img2base64'
|
||||
import db from '../../datastore/index'
|
||||
import { Notification, clipboard } from 'electron'
|
||||
import crypto from 'crypto'
|
||||
import MD5 from 'md5'
|
||||
|
||||
// generate COS signature string
|
||||
const generateSignature = (fileName) => {
|
||||
const options = db.read().get('picBed.upyun').value()
|
||||
const path = options.path || ''
|
||||
const operator = options.operator
|
||||
const password = options.password
|
||||
const md5Password = MD5(password)
|
||||
const date = new Date().toGMTString()
|
||||
const uri = `/${options.bucket}/${encodeURI(path)}${encodeURI(fileName)}`
|
||||
const value = `PUT&${uri}&${date}`
|
||||
const sign = crypto.createHmac('sha1', md5Password).update(value).digest('base64')
|
||||
return `UPYUN ${operator}:${sign}`
|
||||
}
|
||||
|
||||
const postOptions = (fileName, signature, imgBase64) => {
|
||||
const options = db.read().get('picBed.upyun').value()
|
||||
const bucket = options.bucket
|
||||
const path = options.path || ''
|
||||
return {
|
||||
method: 'PUT',
|
||||
url: `https://v0.api.upyun.com/${bucket}/${encodeURI(path)}${encodeURI(fileName)}`,
|
||||
headers: {
|
||||
Authorization: signature,
|
||||
Date: new Date().toGMTString()
|
||||
},
|
||||
body: Buffer.from(imgBase64, 'base64'),
|
||||
resolveWithFullResponse: true
|
||||
}
|
||||
}
|
||||
|
||||
const upYunUpload = async (img, type, webContents) => {
|
||||
try {
|
||||
webContents.send('uploadProgress', 0)
|
||||
const imgList = await img2Base64[type](img)
|
||||
webContents.send('uploadProgress', 30)
|
||||
const length = imgList.length
|
||||
const upyunOptions = db.read().get('picBed.upyun').value()
|
||||
const path = upyunOptions.path || ''
|
||||
for (let i in imgList) {
|
||||
const singature = generateSignature(imgList[i].fileName)
|
||||
const options = postOptions(imgList[i].fileName, singature, imgList[i].base64Image)
|
||||
const body = await request(options)
|
||||
if (body.statusCode === 200) {
|
||||
delete imgList[i].base64Image
|
||||
imgList[i]['imgUrl'] = `${upyunOptions.url}/${path}${imgList[i].fileName}${upyunOptions.options}`
|
||||
imgList[i]['type'] = 'upyun'
|
||||
if (i - length === -1) {
|
||||
webContents.send('uploadProgress', 60)
|
||||
}
|
||||
} else {
|
||||
webContents.send('uploadProgress', -1)
|
||||
return new Error()
|
||||
}
|
||||
}
|
||||
webContents.send('uploadProgress', 100)
|
||||
return imgList
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
const body = JSON.parse(err.error)
|
||||
webContents.send('uploadProgress', -1)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: `错误码:${body.code},请打开浏览器粘贴地址查看相关原因。`
|
||||
})
|
||||
notification.show()
|
||||
clipboard.writeText('http://docs.upyun.com/api/errno/')
|
||||
// throw new Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
export default upYunUpload
|
||||
@@ -1,99 +0,0 @@
|
||||
import request from 'request-promise'
|
||||
import * as img2Base64 from './img2base64'
|
||||
import db from '../../datastore/index'
|
||||
import { Notification } from 'electron'
|
||||
const j = request.jar()
|
||||
const rp = request.defaults({jar: j})
|
||||
const UPLOAD_URL = 'http://picupload.service.weibo.com/interface/pic_upload.php?ori=1&mime=image%2Fjpeg&data=base64&url=0&markpos=1&logo=&nick=0&marks=1&app=miniblog'
|
||||
|
||||
const postOptions = (formData) => {
|
||||
return {
|
||||
method: 'POST',
|
||||
url: 'https://passport.weibo.cn/sso/login',
|
||||
headers: {
|
||||
Referer: 'https://passport.weibo.cn/signin/login',
|
||||
contentType: 'application/x-www-form-urlencoded'
|
||||
},
|
||||
formData,
|
||||
json: true,
|
||||
resolveWithFullResponse: true
|
||||
}
|
||||
}
|
||||
|
||||
const weiboUpload = async function (img, type, webContents) {
|
||||
try {
|
||||
webContents.send('uploadProgress', 0)
|
||||
const formData = {
|
||||
username: db.read().get('picBed.weibo.username').value(),
|
||||
password: db.read().get('picBed.weibo.password').value()
|
||||
}
|
||||
const quality = db.read().get('picBed.weibo.quality').value()
|
||||
const cookie = db.read().get('picBed.weibo.cookie').value()
|
||||
const chooseCookie = db.read().get('picBed.weibo.chooseCookie').value()
|
||||
const options = postOptions(formData)
|
||||
let res
|
||||
if (!chooseCookie) {
|
||||
res = await rp(options)
|
||||
}
|
||||
webContents.send('uploadProgress', 30)
|
||||
if (chooseCookie || res.body.retcode === 20000000) {
|
||||
if (res) {
|
||||
for (let i in res.body.data.crossdomainlist) {
|
||||
await rp.get(res.body.data.crossdomainlist[i])
|
||||
}
|
||||
}
|
||||
webContents.send('uploadProgress', 60)
|
||||
const imgList = await img2Base64[type](img)
|
||||
for (let i in imgList) {
|
||||
let opt = {
|
||||
formData: {
|
||||
b64_data: imgList[i].base64Image
|
||||
}
|
||||
}
|
||||
if (chooseCookie) {
|
||||
opt.headers = {
|
||||
Cookie: cookie
|
||||
}
|
||||
}
|
||||
let result = await rp.post(UPLOAD_URL, opt)
|
||||
result = result.replace(/<.*?\/>/, '').replace(/<(\w+).*?>.*?<\/\1>/, '')
|
||||
delete imgList[i].base64Image
|
||||
const resTextJson = JSON.parse(result)
|
||||
if (resTextJson.data.pics.pic_1.pid === undefined) {
|
||||
webContents.send('uploadProgress', -1)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: '微博Cookie失效,请在网页版重新登录一遍'
|
||||
})
|
||||
notification.show()
|
||||
return new Error()
|
||||
} else {
|
||||
const extname = imgList[i].extname === '.gif' ? '.gif' : '.jpg'
|
||||
imgList[i]['imgUrl'] = `https://ws1.sinaimg.cn/${quality}/${resTextJson.data.pics.pic_1.pid}${extname}`
|
||||
imgList[i]['type'] = 'weibo'
|
||||
}
|
||||
delete imgList[i].extname
|
||||
}
|
||||
webContents.send('uploadProgress', 100)
|
||||
return imgList
|
||||
} else {
|
||||
webContents.send('uploadProgress', -1)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: res.body.msg
|
||||
})
|
||||
notification.show()
|
||||
return new Error()
|
||||
}
|
||||
} catch (err) {
|
||||
webContents.send('uploadProgress', -1)
|
||||
const notification = new Notification({
|
||||
title: '上传失败!',
|
||||
body: '服务端出错,请重试'
|
||||
})
|
||||
notification.show()
|
||||
throw new Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
export default weiboUpload
|
||||
@@ -160,6 +160,8 @@ export default {
|
||||
text-align center
|
||||
margin 10px auto
|
||||
#upload-view
|
||||
.view-title
|
||||
margin 20px auto
|
||||
#upload-area
|
||||
height 220px
|
||||
border 2px dashed #dddddd
|
||||
|
||||
Reference in New Issue
Block a user