Skip to content

Instantly share code, notes, and snippets.

@Meowu
Last active December 28, 2021 13:07
Show Gist options
  • Save Meowu/a8840c46e1e33604ccf2fb1436afa800 to your computer and use it in GitHub Desktop.
Save Meowu/a8840c46e1e33604ccf2fb1436afa800 to your computer and use it in GitHub Desktop.
let map = {}; //定义一个map对象,用来存放每一ms的数据量, key: 毫秒 value: 字节数,示例: 1578648506560: 50
let map_max_key = 0;// 当前map中最大的key
const change = async (i, value) => {
map[i] = value;
map_max_key = i
};
/**
* 上传文件至阿里云
* @param _objName
* @param _file
* @returns 0-成功 1-失败 2-取消
*/
async function uploadFile(_objName, _file) {
let logFlag = false;//是否进行日志记录的标记位
//main.log,main.old.log,task.log这3个文件本身就是
if (_file.indexOf('main.log') === -1 && _file.indexOf('main.old.log') === -1 && _file.indexOf('task.log') === -1) {
logFlag = true;
}
/**
* 处理分片上传的参数
* @param res 上传的返回信息
* @param partSize 分片的大小
*/
function handle_network_speed(res, partSize) {
const spend_time = res.rt;//单位ms
const end_time = new Date(res.headers.date).getTime();
const start_time = end_time - spend_time;
let network_speed = parseInt(partSize / spend_time); // 每ms中上传的字节(b)数
if (network_speed === 0) {
// nothing to do
} else {
handle_network_speed_change(start_time, end_time, network_speed);
}
}
//start upload
try {
if (fs.readFileSync(_file).length === 0) {
return false;
}
const fileLength = fs.readFileSync(_file).length;
const partSize = 1024 * 1024;
const result = await OSSCLIENT.multipartUpload(_objName, _file, {
parallel: 4, // 并发上传的分片个数
partSize: partSize, // 每个part的大小,单位为b,此处设置为1MB
timeout: 1000 * 60 * 10, //设置超时时间单位毫秒,此处设置为60秒
progress: (p, cpt, res) => {
if (cpt && cpt.doneParts && cpt.doneParts.length > 0 && logFlag) {
handle_network_speed(res, partSize);
}
}
});
if (result.res.status === 200) {
// 上传成功
if (fileLength <= partSize && logFlag) {
handle_network_speed(result.res, fileLength);
}
try {
if (logFlag) {
log.info(result);
}
} catch (e) {
}
console.log('上传结束');
return 0
} else {
// 失败
try {
if (logFlag) {
log.error(result);
}
} catch (e) {
}
return 1;
}
} catch (err) {
if (OSSCLIENT.isCancel()) {
// 取消上传
try {
if (logFlag) {
log.info("取消上传->" + _file);
}
} catch (e) {
}
return 2
} else if (err.code === 'ConnectionTimeoutError') {
// 连接超时
try {
if (logFlag) {
log.log("连接超时!!!");
}
} catch (e) {
}
} else {
try {
if (logFlag) {
log.error(err);
}
} catch (e) {
}
}
return 1;
}
}
/**
* 处理上传对象
* @param start_time 开始时间
* @param end_time 结束时间
* @param network_speed 平均每ms传输的字节数
* @returns {Promise<void>}
*/
const handle_network_speed_change = async (start_time, end_time, network_speed) => {
// 如果超过10秒没有传输数据,则清空map
if ((start_time - map_max_key) >= 10000) {
map = {}
}
for (let i = start_time; i <= end_time; i++) {
const value = await map[i];
if (value) {
await change(i, value + network_speed);
} else {
await change(i, network_speed);
}
}
};
定义一个定时器,1s执行一次,用来刷新网速显示
/**
* 定义一个1s的定时器
* 每次取当前时间前1s内发生的数据传输记录,计算上传速度
*/
setInterval(() => {
const now = new Date().getTime();
// 如果超过10秒没有传输数据,则清空map
if ((now - map_max_key) >= 10000) {
map = {}
}
const end_time = now - 1000;
const start_time = end_time - 1000;
let totalSize = 0;
let totalCount = 0;
for (let i = start_time; i <= end_time; i++) {
if (map[i]) {
totalCount++;
totalSize += map[i]
}
}
let network_speed = totalSize / 1024 / totalCount * 1000;
if (!network_speed) {
network_speed = '0.00 Kb/s'
} else if (network_speed < 1024) {
network_speed = network_speed.toFixed(2) + ' Kb/s'
} else {
network_speed = (network_speed / 1024);
network_speed = network_speed.toFixed(2) + ' Mb/s'
}
mainWindow.webContents.send('handle_network_speed_change', network_speed);
console.log(184, Object.keys(map).length)
}, 1000);
/**
* 定义一个1s的定时器
* 每次取当前时间前1s内发生的数据传输记录,计算上传速度
*/
setInterval(() => {
const now = new Date().getTime();
// 如果超过10秒没有传输数据,则清空map
if ((now - map_max_key) >= 10000) {
map = {}
}
const end_time = now - 1000;
const start_time = end_time - 1000;
let totalSize = 0;
let totalCount = 0;
for (let i = start_time; i <= end_time; i++) {
if (map[i]) {
totalCount++;
totalSize += map[i]
}
}
let network_speed = totalSize / 1024 / totalCount * 1000;
if (!network_speed) {
network_speed = '0.00 Kb/s'
} else if (network_speed < 1024) {
network_speed = network_speed.toFixed(2) + ' Kb/s'
} else {
network_speed = (network_speed / 1024);
network_speed = network_speed.toFixed(2) + ' Mb/s'
}
mainWindow.webContents.send('handle_network_speed_change', network_speed);
console.log(184, Object.keys(map).length)
}, 1000);
ipcRenderer.on('handle_network_speed_change', async (event, network_speed) => {
console.log(network_speed);
this.setState({current_network_speed: network_speed});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment