Эх сурвалжийг харах

Добавлен метод unTar

Book Pauk 6 жил өмнө
parent
commit
b1d60c19d5

+ 43 - 12
server/core/FileDecompressor.js

@@ -2,10 +2,11 @@ const fs = require('fs-extra');
 const zlib = require('zlib');
 const zlib = require('zlib');
 const crypto = require('crypto');
 const crypto = require('crypto');
 const path = require('path');
 const path = require('path');
-const utils = require('./utils');
 const extractZip = require('extract-zip');
 const extractZip = require('extract-zip');
 const unbzip2Stream = require('unbzip2-stream');
 const unbzip2Stream = require('unbzip2-stream');
+const tar = require('tar-fs')
 
 
+const utils = require('./utils');
 const FileDetector = require('./FileDetector');
 const FileDetector = require('./FileDetector');
 
 
 class FileDecompressor {
 class FileDecompressor {
@@ -26,7 +27,7 @@ class FileDecompressor {
             files: []
             files: []
         };
         };
 
 
-        if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2' || fileType.ext == 'gz')) {
+        if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2' || fileType.ext == 'gz' || fileType.ext == 'tar')) {
             return result;
             return result;
         }
         }
 
 
@@ -95,7 +96,43 @@ class FileDecompressor {
         });
         });
     }
     }
 
 
-    async unBz2(filename, outputDir) {
+    unBz2(filename, outputDir) {
+        return this.decompressByStream(unbzip2Stream(), filename, outputDir);
+    }
+
+    unGz(filename, outputDir) {
+        return this.decompressByStream(zlib.createGunzip(), filename, outputDir);
+    }
+
+    unTar(filename, outputDir) {
+        return new Promise((resolve, reject) => {
+            const files = [];
+
+            const tarExtract = tar.extract(outputDir, {
+                map: (header) => {
+                    files.push({path: header.name, size: header.size});
+                    return header;
+                }
+            });
+
+            tarExtract.on('finish', () => {
+                resolve(files);
+            });
+
+            tarExtract.on('error', (err) => {
+                reject(err);
+            });
+
+            const inputStream = fs.createReadStream(filename);
+            inputStream.on('error', (err) => {
+                reject(err);
+            });
+
+            inputStream.pipe(tarExtract);
+        });
+    }
+
+    decompressByStream(stream, filename, outputDir) {
         return new Promise((resolve, reject) => {
         return new Promise((resolve, reject) => {
             const file = {path: path.basename(filename)};
             const file = {path: path.basename(filename)};
             const outFilename = `${outputDir}/${file.path}`;
             const outFilename = `${outputDir}/${file.path}`;
@@ -103,7 +140,7 @@ class FileDecompressor {
             const inputStream = fs.createReadStream(filename);
             const inputStream = fs.createReadStream(filename);
             const outputStream = fs.createWriteStream(outFilename);
             const outputStream = fs.createWriteStream(outFilename);
 
 
-            outputStream.on('close', async() => {
+            outputStream.on('finish', async() => {
                 try {
                 try {
                     file.size = (await fs.stat(outFilename)).size;
                     file.size = (await fs.stat(outFilename)).size;
                 } catch (e) {
                 } catch (e) {
@@ -120,15 +157,9 @@ class FileDecompressor {
                 reject(err);
                 reject(err);
             });
             });
         
         
-            inputStream.pipe(unbzip2Stream()).pipe(outputStream);
+            inputStream.pipe(stream).pipe(outputStream);
         });
         });
-    }
-
-    async unGz(filename, outputDir) {
-    }
-
-    async unTar(filename, outputDir) {
-    }
+   }
 
 
     async gzipBuffer(buf) {
     async gzipBuffer(buf) {
         return new Promise((resolve, reject) => {
         return new Promise((resolve, reject) => {