|
@@ -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;
|
|
|
}
|