NodeJS: Как заархивировать (локальные) файлы после того, как сделано с JIMP - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь использовать NodeJS для автоматизации некоторых тривиальных процедур на моем компьютере.Прямо сейчас я могу конвертировать некоторые PNG-файлы в JPG.Я хотел бы связать их все в один почтовый индекс.

const fs = require('fs')
const path = require('path')
const jimp = require('jimp')

const files = fs.readdirSync('./')

// Convert all png to jpg
const pngs = files.filter(file => path.extname(file).toLowerCase() === '.png')

let jpgs = []

Promise.all(pngs.map(png => jimp.read('./' + png))).then(jimps => {
  jimps.map((img, i) => {
    img
      .rgba(false)
      .background(0xffffffff)
      .write(`./jpgs/${path.basename(pngs[i], '.png')}.jpg`)
  })
  console.log('Done converting')
})

// Zip all the .png and .jpg files into PNGs.zip and JPGs.zip
// TODO:

Я возился с JSZip, но не смог заставить его работать.

РЕШЕНИЕ

const fs = require('fs')
const path = require('path')
const jimp = require('jimp')
const CLIProgress = require('cli-progress')

const zipPNG = new require('node-zip')()
const zipJPG = new require('node-zip')()

const files = fs.readdirSync('./')

// Convert all png to jpg
const pngs = files.filter(file => path.extname(file).toLowerCase() === '.png')
let jpgs = []

Promise.all(pngs.map(png => jimp.read('./' + png))).then(jimps => {
  const bar = new CLIProgress.Bar({}, CLIProgress.Presets.shades_classic)
  bar.start(pngs.length, 0)

  jimps.map((img, i) => {
    img
      .rgba(false)
      .background(0xffffffff)
      .write(`./jpgs/${path.basename(pngs[i], '.png')}.jpg`)

    bar.update(i + 1)
  })
  bar.stop()
  console.log('Done converting')

  // Pack the files nicely in ZIP
  pngs.forEach(png => {
    zipPNG.file(png, fs.readFileSync(path.join('./', png)))
    zipJPG.file(
      `${path.basename(png, '.png')}.jpg`,
      fs.readFileSync(`./jpgs/${path.basename(png, '.png')}.jpg`)
    )
  })

  let data = zipPNG.generate({ base64: false, compression: 'DEFLATE' })
  fs.writeFileSync('PNG.zip', data, 'binary')
  console.log('PNGs zipped')

  data = zipJPG.generate({ base64: false, compression: 'DEFLATE' })
  fs.writeFileSync('./jpgs/JPG.zip', data, 'binary')
  console.log('JPGs zipped')
})

1 Ответ

0 голосов
/ 20 декабря 2018

Я бы использовал пакет npm node-zip .Это очень простая библиотека с простым в использовании интерфейсом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...