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} */ 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}); });