electron 日志打包并上传


前言

在开发electron应用中,可能需要上传应用的日志到后台服务器,已便发生问题时排查
参考:https://segmentfault.com/a/1190000021528488

文件压缩

实际应用中,日志文件可能有多个,这个时候可能需要对多个文件进行压缩。文件一般是放在固定的文件夹,这里封装了压缩整个文件夹的方法。

  • 第三方库jszip,下载依赖包
yarn add jszip
  • 封装方法
const fs = require('fs')
const JSZIP = require('jszip')
const zip = new JSZIP()
/**
 * 将文件夹压缩成zip
 * @param {*} folderPath 待压缩文件夹
 * @param {*} targetPath 压缩后的文件路径
 */
export async function zipFolder(folderPath, targetPath) {
  pushZip(zip, folderPath)
  const content = await zip.generateAsync({
    type: 'nodebuffer',
    compression: 'DEFLATE',
    compressionOptions: {
      level: 9
    }
  })
  await fs.writeFileSync(targetPath, content)
}
function pushZip(folder, pPath) {
  const files = fs.readdirSync(pPath, {withFileTypes: true})
  files.forEach((dirent, index) => {
    let filePath = `${pPath}/${dirent.name}`
    if (dirent.isDirectory()) {
      let zipFloder = zip.folder(filePath.replace(`${folder}/`, ''))
      pushZip(zipFloder, filePath)
    } else {
      folder.file(dirent.name, fs.readFileSync(filePath))
    }
  })
}
  • 上传至远程服务器
// 第三方http请求库
import axios from 'axios'
const fs = require('fs')
function upload() {
  const fileData = fs.readFileSync(zipFilePath)
  let file = new File([fileData], 'log.zip', { type: 'application/x-zip-compressed' })
  const formData = new FormData()
  formData.append('file', file)
  const requestUrl = `` // 请求的远程服务器地址
  const res = await axios.post(requestUrl, formData)
  // 后端接口返回数据,判断是否上传成功
  // 上传成功删除压缩文件
  fs.unlinkSync(zipFilePath)
}