FileDecompressor.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. const fs = require('fs-extra');
  2. const zlib = require('zlib');
  3. const crypto = require('crypto');
  4. const decompress = require('decompress');
  5. const FileDetector = require('./FileDetector');
  6. class FileDecompressor {
  7. constructor() {
  8. this.detector = new FileDetector();
  9. }
  10. async decompressFile(filename, outputDir) {
  11. const fileType = await this.detector.detectFile(filename);
  12. if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2'))
  13. return filename;
  14. const files = await decompress(filename, outputDir);
  15. let result = filename;
  16. let max = 0;
  17. if (files.length) {
  18. //ищем файл с максимальным размером
  19. for (let file of files) {
  20. if (file.data.length > max) {
  21. result = `${outputDir}/${file.path}`;
  22. max = file.data.length;
  23. }
  24. }
  25. }
  26. return result;
  27. }
  28. async gzipBuffer(buf) {
  29. return new Promise((resolve, reject) => {
  30. zlib.gzip(buf, {level: 1}, (err, result) => {
  31. if (err) reject(err);
  32. resolve(result);
  33. });
  34. });
  35. }
  36. async gzipFileIfNotExists(filename, outDir) {
  37. const buf = await fs.readFile(filename);
  38. const hash = crypto.createHash('sha256').update(buf).digest('hex');
  39. const outFilename = `${outDir}/${hash}`;
  40. if (!await fs.pathExists(outFilename)) {
  41. await fs.writeFile(outFilename, await this.gzipBuffer(buf))
  42. } else {
  43. await fs.utimes(outFilename, Date.now()/1000, Date.now()/1000);
  44. }
  45. return outFilename;
  46. }
  47. }
  48. module.exports = FileDecompressor;