С Новым годом! Форум программистов, компьютерный форум, киберфорум
Node.js
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
3 / 3 / 0
Регистрация: 16.06.2014
Сообщений: 146
Записей в блоге: 4

Как, используя потоки Node, скачать с сервера файл + отдельную строку?

08.09.2021, 16:33. Показов 1993. Ответов 5

Студворк — интернет-сервис помощи студентам
Всем привет.
Задача такова: клиент отправляет через fetch() запрос на скачивание файла с сервера. Нужно отправить ему файл + некую строку с отчётом о проделанной операции.
В скачивании файла ничего трудного нет:
JavaScript
1
2
3
4
5
6
7
const fs = require('fs');
 
//Используем Express
app.post("URL_запроса на скачивание", function(req, res) {
  let downloadStream = fs.createReadStream(путьКФайлу);
  downloadStream.pipe(res);
});
А вот как к этому же res приделать строку?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.09.2021, 16:33
Ответы с готовыми решениями:

Как скачать файл с http сервера, если директория неизвестна? Через командную строку
Как скачать файл с http сервера, если директория неизвестна.

Текстовый файл. В новый файл перенести каждое слово как отдельную строку.
Пусть дан текстовый файл. В новый файл перенести каждое слово как отдельную строку. Пустых строк в заданном файле нет( строки длинной не...

В новый файл перенести каждое слово как отдельную строку
Пусть дан текстовый файл. В новый файл перенесите каждое слово как отдельную строку. Переход к новой строке в исходном файле соответствует...

5
Молодой техлид)
Эксперт JSЭксперт HTML/CSS
 Аватар для mr_dramm
1818 / 1056 / 329
Регистрация: 17.07.2021
Сообщений: 2,146
Записей в блоге: 14
08.09.2021, 17:19
Цитата Сообщение от ПисательГудвин Посмотреть сообщение
А вот как к этому же res приделать строку?
push()
0
3 / 3 / 0
Регистрация: 16.06.2014
Сообщений: 146
Записей в блоге: 4
10.09.2021, 00:14  [ТС]
Я в итоге стал использовать res.write().

Раз уж зашла речь об отправке файла + строки, поделюсь, как реализовал это.
В общем, в ответе нужно передать непрерывную последовательность бинарных данных, представляющих собой СтрокаСДлинойСтрокиОтчёта + СтрокаОтчёта + Файл. На клиенте всё это дело будет распарсиваться - сначала получат длину строки отчёта, потом, зная её, выцепят сам отчёт, а потом, отсоединив файл от всего этого, предоставят браузеру его сохранить где-то там у себя в "Загрузках".
Проблема вышла с передачей длины отчёта, поскольку хз, какова будет эта длина, и сколько байтов займёт выражающее её число (а не зная, сколько байтов, как клиент его получит?). Может, я просто ещё неуч, но я так и не нашёл способ это выяснить и в итоге решил задать, что СтрокаСДлинойСтрокиОтчёта всегда состоит из 10 символов - т.е., 10 байт в кодировке utf8. Если длина отчёта менее, чем десятизначная (да уж наверное!), оставшиеся места заполняются пробелами. Клиент там у себя срежет их через trim(). Если знаете, как сделать лучше - буду рад подсказке)
В итоге получилось примерно следующее:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const fs = require('fs');
 
const reportLengthStrUniSize = 10;
 
//Используем Express
app.post("URL_запроса на скачивание", function(req, res) {
  let downloadStream = fs.createReadStream(путьКФайлу);
  let report = "БлаБлаБла";
  let reportLengthStr = String(report.length);
 
  for(let i=reportLengthStr.length+1; i<=reportLengthStrUniSize; i++) {
    reportLengthStr += " ";
  }
  
  res.write(reportLengthStr + report);
  downloadStream.pipe(res);
});
0
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
10.09.2021, 00:56
Возможно, можно сгенерировать случайную строку, достаточно длинную для того, чтобы исключить возможность случайного совпадения, которая будет известна как серверу, так и клиенту, и эту строку использовать как разделитель между Строкой_отчёта и Файлом?..
0
123 / 98 / 15
Регистрация: 02.02.2014
Сообщений: 346
10.09.2021, 01:10
А клиенту прямо на скачивание отдавать? если чтобы просто показать, может тогда проще каким base_64 и всё это в json
0
3 / 3 / 0
Регистрация: 16.06.2014
Сообщений: 146
Записей в блоге: 4
10.09.2021, 03:36  [ТС]
Цитата Сообщение от evil_pixi Посмотреть сообщение
А клиенту прямо на скачивание отдавать? если чтобы просто показать, может тогда проще каким base_64 и всё это в json
Честно говоря, не понял, что вы хотели сказать.
Да, речь идёт именно о скачивании. Есть сайт с хранилищем картинок, юзер имеет возможность их скачивать. Если он хочет скачать одну картинку, отдаём её саму, если больше одной - создаём на сервере zip-архив из нужных картинок и отдаём его. Вот тут и нужен отчёт, т.к., в теории, могут быть ошибки при создании архива (например, не все файлы удалось добавить), и клиенту надо об этом сообщить. Плюс, в отчёте (он представляет собой json-объект, превращённый в строку) содержится и имя файла-архива.
Если скачивается одна картинка, то, в принципе, можно обойтись без отчёта. Требуется как-то передать имя файла, но это можно сделать в заголовках, применив ф-ю Express'а res.attachment(). Однако мне и тут больше нравится вариант с отчётом: во-первых, единообразие упрощает код, и на сервере, и на клиенте, во-вторых, там весьма черезжопный способ извлечения имени файла из заголовка, с помощью строковых функций.

Цитата Сообщение от DrType Посмотреть сообщение
Возможно, можно сгенерировать случайную строку, достаточно длинную для того, чтобы исключить возможность случайного совпадения, которая будет известна как серверу, так и клиенту, и эту строку использовать как разделитель между Строкой_отчёта и Файлом?..
Я думал о чём-то подобном, до прихода к варианту со строкой, но, по-моему, это более затратный и ненадёжный способ.
В идеале нужен способ как-то записать Number в буфер (класс Buffer), а потом прочитать его оттуда. Но среди вариантов метода Buffer.from() я не нашёл того, что позволяет делать буфер из целого числа любой величины. Может, там есть какие-то ещё методы - пока нет времени особо вникать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2021, 03:36
Помогаю со студенческими работами здесь

Как скачать файл с сервера
скачал себе NetBeans IDE установил сделал проект java приложение, нашел по словам рабочий код java пихаю в проект и нифига -_-...

Как скачать файл с ftp сервера?
Не кидайте ссылки на такие же темы, там не очень понятно.

Как правильно скачать файл с FTP сервера
Задача: Периодически сканировать каталог на ftp сервер и скачивать файлы. После скачивания файл на сервер удаляется. Файлы размером не...

Как скачать файл размером 11 Мб с FTP-сервера?
Пытался скачать через ftp командой get файл весом 11мб не хочет качать, как мне его скачать?

Как скачать файл с кодом рнр, с сервера?
Всем привет. Пытаюсь сделать ссылку, для скачивания файла с рнр кодом. Вот так делать нельзя, это понятно: &lt;a...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru