Потоковая передача большого zip-файла из NodeJS, ExpressJavascript

Форум по Javascript
Ответить
Anonymous
 Потоковая передача большого zip-файла из NodeJS, Express

Сообщение 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.`);
});
};


Подробнее здесь: https://stackoverflow.com/questions/793 ... js-express
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»