const https = require('https');
const fs = require('fs');
const path = require('path');
const { URL } = require('url');
async function downloadFile(url, outputPath) {
// Парсим URL для получения компонентов
const parsedUrl = new URL(url);
// Если путь для сохранения не указан, используем имя файла из URL
if (!outputPath) {
outputPath = path.basename(parsedUrl.pathname);
}
return new Promise((resolve, reject) => {
const file = fs.createWriteStream(outputPath);
https.get(url, (response) => {
// Проверяем статус код ответа
if (response.statusCode !== 200) {
reject(new Error(`Ошибка загрузки: ${response.statusCode}`));
return;
}
// Получаем общий размер файла для прогресса
const totalSize = parseInt(response.headers['content-length'], 10);
let downloadedSize = 0;
response.pipe(file);
// Опционально: отслеживание прогресса загрузки
response.on('data', (chunk) => {
downloadedSize += chunk.length;
if (totalSize) {
const percent = (downloadedSize / totalSize * 100).toFixed(2);
console.log(`Загружено: ${percent}%`);
}
});
file.on('finish', () => {
file.close();
resolve({ path: outputPath, size: downloadedSize });
});
}).on('error', (err) => {
fs.unlink(outputPath, () => reject(err));
});
file.on('error', (err) => {
fs.unlink(outputPath, () => reject(err));
});
});
}
// Пример использования
downloadFile('https://example.com/file.zip', './downloaded-file.zip')
.then((result) => console.log(`Файл сохранен: ${result.path} (${result.size} байт)`))
.catch((err) => console.error('Ошибка загрузки:', err));