Я хочу загрузить большой zip-файл размером 3 ГБ, содержащий 2000 или более изображений с их миниатюрами, в мобильное приложение в зависимости от запроса пользователя с моего сервера NodeJS Express, используя маршрут.
Zip-файл создается с помощью архиватора внутри воркера. до этого момента он работает нормально.
На моей локальной машине все работает слишком хорошо, но на производстве иногда он работает очень быстро при потоковой передаче, а иногда для достижения тайм-аута требуется слишком много времени. только после 5–10% загрузки. Даже в то время на сервере не было такой нагрузки.
Ниже приведено что-то вроде моей реализации. Я не могу понять, в чем проблема.
Это потому, что когда у меня медленный Интернет, сервер отправляет данные очень медленно, чтобы соответствовать моей скорости загрузки, или это что-то еще??
const fs = require('fs');
const fsPromises = require('fs/promises');
const crypto = require('crypto');
const path = require('path');
const { logger } = require('config/winston');
const downloadZip = async (req, res) => {
// Create archive
const fnm = 'file_' + crypto.randomBytes(8).toString('hex');
const zipName = fnm + 'zip';
const zipFilePath = path.join('tmpfolder', zipName);
// Get archive from worker
try {
const images = await getImages();
zipStatus = await zipWorker(images);
} catch (err) {
throw `Error in creating zip.`;
}
// Get stats
let zipSize = 0;
try {
const zipStats = await fsPromises.stat(zipFilePath);
zipSize = zipStats.size || 0;
} catch (err) {
throw `Zip stats not found.`;
}
// Download
logger.verbose(`Preparing to download.`);
res.setHeader('Content-Type', 'application/zip');
res.setHeader('Content-Disposition', `attachment; filename=images.zip`);
res.setHeader('Content-Length', zipSize);
const resFile = fs.createReadStream(zipFilePath);
resFile.pipe(res);
resFile.on('error', err => {
logger.error(`Error in streaming zip.`);
res.end();
});
// Print downloading percent on server
let bytesSent = 0;
resFile.on('data', chunk => {
if (zipSize > 0) {
bytesSent += chunk?.length;
const percentage = ((bytesSent / zipSize) * 100).toFixed(2);
logger.verbose(`Downloading ${percentage}%`); // {
logger.verbose(`Images downloaded.`);
});
res.on('close', () => {
resFile.destroy(); // Close the file stream immediately
});
res.on('finish', () => {
logger.verbose(`File streamed successfully.`);
});
};
Подробнее здесь: https://stackoverflow.com/questions/793 ... js-express
Потоковая передача большого zip-файла из NodeJS, Express ⇐ Javascript
Форум по Javascript
-
Anonymous
1736167044
Anonymous
Я хочу загрузить большой zip-файл размером 3 ГБ, содержащий 2000 или более изображений с их миниатюрами, в мобильное приложение в зависимости от запроса пользователя с моего сервера NodeJS Express, используя маршрут.
Zip-файл создается с помощью архиватора внутри воркера. до этого момента он работает нормально.
На моей локальной машине все работает слишком хорошо, но на производстве иногда он работает очень быстро при потоковой передаче, а иногда для достижения тайм-аута требуется слишком много времени. только после 5–10% загрузки. Даже в то время на сервере не было такой нагрузки.
Ниже приведено что-то вроде моей реализации. Я не могу понять, в чем проблема.
Это потому, что когда у меня медленный Интернет, сервер отправляет данные очень медленно, чтобы соответствовать моей скорости загрузки, или это что-то еще??
const fs = require('fs');
const fsPromises = require('fs/promises');
const crypto = require('crypto');
const path = require('path');
const { logger } = require('config/winston');
const downloadZip = async (req, res) => {
// Create archive
const fnm = 'file_' + crypto.randomBytes(8).toString('hex');
const zipName = fnm + 'zip';
const zipFilePath = path.join('tmpfolder', zipName);
// Get archive from worker
try {
const images = await getImages();
zipStatus = await zipWorker(images);
} catch (err) {
throw `Error in creating zip.`;
}
// Get stats
let zipSize = 0;
try {
const zipStats = await fsPromises.stat(zipFilePath);
zipSize = zipStats.size || 0;
} catch (err) {
throw `Zip stats not found.`;
}
// Download
logger.verbose(`Preparing to download.`);
res.setHeader('Content-Type', 'application/zip');
res.setHeader('Content-Disposition', `attachment; filename=images.zip`);
res.setHeader('Content-Length', zipSize);
const resFile = fs.createReadStream(zipFilePath);
resFile.pipe(res);
resFile.on('error', err => {
logger.error(`Error in streaming zip.`);
res.end();
});
// Print downloading percent on server
let bytesSent = 0;
resFile.on('data', chunk => {
if (zipSize > 0) {
bytesSent += chunk?.length;
const percentage = ((bytesSent / zipSize) * 100).toFixed(2);
logger.verbose(`Downloading ${percentage}%`); // {
logger.verbose(`Images downloaded.`);
});
res.on('close', () => {
resFile.destroy(); // Close the file stream immediately
});
res.on('finish', () => {
logger.verbose(`File streamed successfully.`);
});
};
Подробнее здесь: [url]https://stackoverflow.com/questions/79333054/streaming-a-large-zip-file-from-nodejs-express[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия