From 4247665ba445de507a20ed595e8958978dfb7165 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Tue, 19 Feb 2019 01:39:52 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D1=83=20=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=BE=D0=B2=20.gz=20.bz2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 26 +++++++++++++++++++++++++- package.json | 4 +++- server/core/FileDecompressor.js | 33 +++++++++++++++++++++++++++++++-- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 12153f60..ad93ef29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "Liberama", - "version": "0.2.0", + "version": "0.3.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -3095,6 +3095,30 @@ "strip-dirs": "^2.0.0" } }, + "decompress-bzip2": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decompress-bzip2/-/decompress-bzip2-4.0.0.tgz", + "integrity": "sha1-0SVMlJ4F6vYol1QoawY/3Hz/AT8=", + "requires": { + "file-type": "^4.3.0", + "seek-bzip": "^1.0.5" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=" + } + } + }, + "decompress-gz": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/decompress-gz/-/decompress-gz-0.0.1.tgz", + "integrity": "sha512-YMdCWdxHvPplsTbV1tvr2oFJOtAFNxqVMFnKWEmePBXl+LKG5z5bFrowzc12Jzd7O29nnzI/D1M95Asx0Qa1fg==", + "requires": { + "file-type": "^5.2.0" + } + }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", diff --git a/package.json b/package.json index aaedabba..69b559cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Liberama", - "version": "0.3.1", + "version": "0.3.2", "engines": { "node": ">=10.0.0" }, @@ -60,6 +60,8 @@ "chardet": "^0.7.0", "compression": "^1.7.3", "decompress": "^4.2.0", + "decompress-bzip2": "^4.0.0", + "decompress-gz": "0.0.1", "detect-file-type": "^0.2.0", "element-ui": "^2.4.11", "express": "^4.16.4", diff --git a/server/core/FileDecompressor.js b/server/core/FileDecompressor.js index d152ace8..46b5eafe 100644 --- a/server/core/FileDecompressor.js +++ b/server/core/FileDecompressor.js @@ -1,8 +1,12 @@ const fs = require('fs-extra'); const zlib = require('zlib'); const crypto = require('crypto'); +const path = require('path'); const utils = require('./utils'); const decompress = require('decompress'); +const decompressGz = require('decompress-gz'); +const decompressBzip2 = require('decompress-bzip2'); + const FileDetector = require('./FileDetector'); class FileDecompressor { @@ -13,11 +17,33 @@ class FileDecompressor { async decompressFile(filename, outputDir) { const fileType = await this.detector.detectFile(filename); - if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2')) + if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2' || fileType.ext == 'gz')) return filename; - const files = await decompress(filename, outputDir); + //дурной decompress, поэтому в 2 этапа + //этап 1 + let files = []; + try { + files = await decompress(filename, outputDir); + } catch (e) { + // + } + //этап 2 + if (files.length == 0) { + try { + files = await decompress(filename, outputDir, { + inputFile: filename, + plugins: [ + decompressGz(), + decompressBzip2({path: path.basename(filename)}), + ] + }); + } catch (e) { + // + } + } + let result = filename; let max = 0; if (files.length) { @@ -29,6 +55,9 @@ class FileDecompressor { } } } + //дурной decompress + if (result != filename) + await fs.chmod(result, 0o664); return result; }