keon
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Помогите дописать скрипт под Node.JS для пакетной загрузки изображений без использования сторонних библиотек, только на стоковых fs, path, https & etc. Мой скрипт в большинстве случаев отрабатывает корректно (приходят все байты изображений), но бывают пропуски байтов по изображениям, думаю это связано с потерей пакетов и/или большого количества одновременных закачек (не удается сделать загрузку синхронно, найденные примеры примитивные и не подходят). Скрипт Код: const fs = require('fs'); const path = require('path'); const https = require('https'); const domain = require('domain').create(); const urls = [ require('./data.json') ]; // 84 элемента в документе function download(imageUrl, imageFile) { https.get(imageUrl, (res) => { if(res.statusCode !== 200) { // BadRequest, Page not found, etc. console.log(`[ ${current} / ${count} ]: response-error => ${imageUrl} -- code: ${res.statusCode}`); current++; }else { res.pipe( fs.createWriteStream(imageFile) ).on('finish', () => { console.log(`[ ${current} / ${count} ]: progress => ${imageFile} -- finished`); current++; }); } }).on('error', (e) => { console.log(`[ ${current} / ${count} ]: https-error => ${imageUrl} -- ${e.message}`); current++; }); } const IMG_DIR = 'images'; let count = 0, current = 0, imageFile = '', apiPath = ''; const imagePath = path.resolve(__dirname, IMG_DIR); if(!fs.existsSync(imagePath)) fs.mkdirSync(imagePath); domain.on('error', function(err) { console.log(`[ ${current} / ${count} ]: Domain Error = ${err.message}`); current++; }); domain.run(function() { urls.forEach(json => { count = json.length; current = 1; json.forEach(item => { apiPath = path.resolve(imagePath, item.api); if(!fs.existsSync(apiPath)) fs.mkdirSync(apiPath); imageFile = path.resolve(apiPath, item.imageFile); // res.close => file.finish => pipe.finish download(item.imageUrl, imageFile); }); }); }); | хотелось бы понять концепцию гарантированной доставки чанков/пакетов, чтобы пока все байты не пришли, то не начинать новый файл, синхронно и последовательно выкачивать. | Всего записей: 164 | Зарегистр. 21-12-2006 | Отправлено: 16:52 22-04-2020 | Исправлено: keon, 16:56 22-04-2020 |
|