Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Node.JS: пакетная загрузка изображений по URL

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

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

 
хотелось бы понять концепцию гарантированной доставки чанков/пакетов, чтобы пока все байты не пришли, то не начинать новый файл, синхронно и последовательно выкачивать.

Всего записей: 158 | Зарегистр. 21-12-2006 | Отправлено: 16:52 22-04-2020 | Исправлено: keon, 16:56 22-04-2020
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
keon

Цитата:
но бывают пропуски байтов по изображениям

в смысле? поврежденные картинки или что?
содержимое файла в текстовом редакторе смотрели?  может там сервер что то иное выдал.
 

Цитата:
не удается сделать загрузку синхронно

https://usefulangle.com/post/170/nodejs-synchronous-http-request

Всего записей: 9716 | Зарегистр. 20-09-2014 | Отправлено: 20:23 22-04-2020 | Исправлено: Mavrikii, 21:51 22-04-2020
keon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Mavrikii
в смысле? поврежденные картинки или что?
содержимое файла в текстовом редакторе смотрели?  может там сервер что то иное выдал.

да, именно картинки не до конца "докаченые" или искажены (например, наплыв горизонтальных полос друг на друга)
замеряв один раз удачную загрузку (скажем 80мб), я сравниваю с ней как с эталоном все последующие попытки, т.е. мой код не может гарантировать 100% загрузку в любой момент, что сильно огорчает
спасибо за ссылку, завтра отпишусь по результатам
п.с. коды не рабочие из статьи

Всего записей: 158 | Зарегистр. 21-12-2006 | Отправлено: 23:25 22-04-2020 | Исправлено: keon, 23:55 22-04-2020
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
keon

Цитата:
загрузку в любой момент, что сильно огорчает

в заголовках ответа наверняка есть размер - сравнивайте.

Всего записей: 9716 | Зарегистр. 20-09-2014 | Отправлено: 23:37 22-04-2020
keon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
в заголовках ответа наверняка есть размер - сравнивайте

в заголовках есть размер, но в каком месте сравнивать, а самое главное как правильно записать результирующие байты в файл?

Всего записей: 158 | Зарегистр. 21-12-2006 | Отправлено: 00:12 23-04-2020
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
keon

Цитата:
но в каком месте сравнивать

что значит "в каком месте"? это размер тела ответа, если не совпадает - значит что то "побилось".

Всего записей: 9716 | Зарегистр. 20-09-2014 | Отправлено: 00:13 23-04-2020
keon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
что значит "в каком месте"? это размер тела ответа, если не совпадает - значит что то "побилось".

и что дальше? как перекачивать?

Всего записей: 158 | Зарегистр. 21-12-2006 | Отправлено: 00:31 23-04-2020
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
keon

Цитата:
и что дальше? как перекачивать?

в смысле? повторить запрос еще раз, либо записать отдельно что не скачалось и потом отдельно проверить/скачать

Всего записей: 9716 | Зарегистр. 20-09-2014 | Отправлено: 00:38 23-04-2020
keon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
короче, я перепробовал кучу разных вариантов, в том числе при помощи известного пакета request, результат не гарантирован - не докачивает некоторые файлы, 100кб, но не докачивает
 
п.с.
переписал с проверкой и перекачкой, теперь все закачивает в полной мере, но смущают недокаченые файлы, причина так и не понятна
п.с.с.
и процесс немного подвисает на последнем файле (URL), даже если его длина 700кб, странные дела..

Всего записей: 158 | Зарегистр. 21-12-2006 | Отправлено: 11:25 23-04-2020 | Исправлено: keon, 14:05 23-04-2020
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
keon
тут вам никто не поможет, не зная что качается, откуда и тд и тп.
может вас тот сервер ограничивает.

Всего записей: 9716 | Зарегистр. 20-09-2014 | Отправлено: 20:40 23-04-2020
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » Node.JS: пакетная загрузка изображений по URL


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru