спасибо большое, сейчас попробую
Разархивировать zip без скачивания на диск.
-
@fox а как разархивировать через бас?
Через ноду, например через вот этот модуль https://www.npmjs.com/package/node-zip
-
@Fox said in Разархивировать zip без скачивания на диск.:
var request = require('request');
не могу установить этот модуль, в поиске его даже не находит http://prntscr.com/ra9d1y
-
@graf said in Разархивировать zip без скачивания на диск.:
@Fox said in Разархивировать zip без скачивания на диск.:
var request = require('request');
не могу установить этот модуль, в поиске его даже не находит http://prntscr.com/ra9d1y
Он уже установлен
-
@Fox said in Разархивировать zip без скачивания на диск.:
Он уже установлен
-
@GhostZ said in Разархивировать zip без скачивания на диск.:
нужно просто добавить var request = require('request');
http://prntscr.com/ra9htp всё установлено. в папке с модулями он присутствует. может как-то можно удалить всё, чтобы после перезапуска заново скачалось?
UPD: Очистил всё по пути BrowserAutomationStudio\apps\22.5.0\embedded
не вылечилось -
@graf said in Разархивировать zip без скачивания на диск.:
Проверил у товарища, всё тоже самое. что я делаю не так?) или это массовая проблема?)
await(new Promise((resolve, reject) => { const request = require('../../node_modules/npm/node_modules/request'); request("https://www.google.com", function (err, res, body) { console.log("err: " + err) console.log("res: " + res) console.log("body: " + body) resolve() }) }));Тестовый скрипт
-
ты должен получить zip archive как Stream
и потом этот Stream выдает события например файлы итдоткрываешь соединение и как только получил что нужно закрываешь Stream
например .destroy
я сделал утилиту которая читает вложенные файлы из zip gz архивов,
это для еластика и там огромные файлы по 100+gb есть
поэтому можно прочитать первые 10к строкиз gz файла который находится
в зип архиве который находится в другом зип архиве итд.или прочитать рекурсивно первые n cтрочек всех текстовых файлов из всех архивов из директории рекурсивно без разархивации.
пример(stream может быть локальный файл или удаленный)
const streamToString = async (
stream: Stream.Readable,
opts: {
maxLines?: number
},
): Promise<string> => {
const { maxLines } = opts
let nLine = 0
const lines: string[] = []const writable = es.mapSync((line: string) => {
if (nLine >= 0 && nLine % 1e3 === 0) logdebug('nLine: %s', nLine)
if (line) {
lines.push(line)
nLine++
if (maxLines && nLine >= maxLines) {
// logdebug('streamToString::complete')
writable.end()
}
}
})await new Promise((resolve, reject) => {
stream
.pipe(es.split())
.pipe(writable)
.on('error', err => {
logdebug('error:streamToString %O', err)
reject('Error during untar for : ' + err)
})
.on('end', async () => {
// logdebug('stream:end')
resolve()
})
})
return lines.join('\n')
} -
использовал https://github.com/antelle/node-stream-zip
-
@Fox said in Разархивировать zip без скачивания на диск.:
Тестовый скрипт
Не совсем понял, что именно делает тестовый скрипт?
Можно для нубов пояснить? :) -
@AngelOfAncient said in Разархивировать zip без скачивания на диск.:
@Fox said in Разархивировать zip без скачивания на диск.:
Тестовый скрипт
Не совсем понял, что именно делает тестовый скрипт?
Можно для нубов пояснить? :)Я не помню уже, но судя по прикреплённому коду это просто проверка модуля "request". Код отправляет get-запрос на страницу https://www.google.com и выводит в консоль результаты
-
@Fox said in Разархивировать zip без скачивания на диск.:
Через ноду, например через вот этот модуль https://www.npmjs.com/package/node-zip
Скачал модуль. Копирую из мануала:
var zip = new require('node-zip')(data, {base64: false, checkCRC32: true}); console.log(zip.files['test.file']); // Hello thereВ моём случае это:
var zip = new require('node-zip')("ZIP/1.zip", {base64: false, checkCRC32: true}); console.log(zip.files['"ZIP/1.zip"']);Выдаёт в логе "Error: Can't find end of central directory : is this a zip file ? If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html".
Смысл ошибки - он не распознаёт файл архива как архив?
И даёт ссылку уже на другой (?) пакет JSZip, где ещё всё более загадочно.- Если считать файл в переменную FILE_CONTENT обычным способом, то получаем ошибку:
Error: End of data reached (data length = 27585, asked index = 28669). Corrupted zip ?
При коде:
var zip = new require('node-zip')([[FILE_CONTENT]], {base64: false, checkCRC32: true});- Если считать файл в переменную FILE_CONTENT как Base64, то первая команда вроде бы работает:
var zip = new require('node-zip')([[FILE_CONTENT]], {base64: true, checkCRC32: true}); console.log(zip.files['test.file']); // Hello thereНекоторое время висит-работает, потом выдаёт в лог Undefined.
В этом случае не понятно, куда он распаковывает эти файлы, если распаковывает.
...
В сухом остатке, если есть под рукой тестовый скрипт разархивации Zip через Ноду (Не на лету, а обычным способом со скачиванием) - думаю, многим будет актуально. - Если считать файл в переменную FILE_CONTENT обычным способом, то получаем ошибку:
-
@AngelOfAncient said in Разархивировать zip без скачивания на диск.:
var zip = new require('node-zip')([[FILE_CONTENT]], {base64: true, checkCRC32: true});
console.log(zip.files['test.file']); // Hello thereНекоторое время висит-работает, потом выдаёт в лог Undefined.
Вы укажите конкретный файл в архиве, тогда действие вернёт результат
@AngelOfAncient said in Разархивировать zip без скачивания на диск.:
В сухом остатке, если есть под рукой тестовый скрипт разархивации Zip через Ноду (Не на лету, а обычным способом со скачиванием) - думаю, многим будет актуально.
За два года вы первый, кто поинтересовался, так что "многим" это громко сказано.
const fs = require('fs') const unzip = require('unzip') fs.createReadStream('C:/test/1/1.zip').pipe(unzip.Extract({ path: 'C:/test/1/2/' }))тестовый проект (только у модуля проблема с именами файлов в юникоде, вместо кирилицы будут иероглифы)