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

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

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

Author24 — интернет-сервис помощи студентам
Всем привет.
Задача такова: клиент отправляет через 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2021, 16:33
Ответы с готовыми решениями:

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

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

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

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

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

5
молодой
1769 / 1010 / 320
Регистрация: 17.07.2021
Сообщений: 2,048
Записей в блоге: 12
08.09.2021, 17:19 2
Цитата Сообщение от ПисательГудвин Посмотреть сообщение
А вот как к этому же res приделать строку?
push()
0
3 / 3 / 0
Регистрация: 16.06.2014
Сообщений: 146
Записей в блоге: 4
10.09.2021, 00:14  [ТС] 3
Я в итоге стал использовать 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
6458 / 3603 / 1074
Регистрация: 07.09.2019
Сообщений: 5,842
Записей в блоге: 1
10.09.2021, 00:56 4
Возможно, можно сгенерировать случайную строку, достаточно длинную для того, чтобы исключить возможность случайного совпадения, которая будет известна как серверу, так и клиенту, и эту строку использовать как разделитель между Строкой_отчёта и Файлом?..
0
123 / 98 / 15
Регистрация: 02.02.2014
Сообщений: 346
10.09.2021, 01:10 5
А клиенту прямо на скачивание отдавать? если чтобы просто показать, может тогда проще каким base_64 и всё это в json
0
3 / 3 / 0
Регистрация: 16.06.2014
Сообщений: 146
Записей в блоге: 4
10.09.2021, 03:36  [ТС] 6
Цитата Сообщение от evil_pixi Посмотреть сообщение
А клиенту прямо на скачивание отдавать? если чтобы просто показать, может тогда проще каким base_64 и всё это в json
Честно говоря, не понял, что вы хотели сказать.
Да, речь идёт именно о скачивании. Есть сайт с хранилищем картинок, юзер имеет возможность их скачивать. Если он хочет скачать одну картинку, отдаём её саму, если больше одной - создаём на сервере zip-архив из нужных картинок и отдаём его. Вот тут и нужен отчёт, т.к., в теории, могут быть ошибки при создании архива (например, не все файлы удалось добавить), и клиенту надо об этом сообщить. Плюс, в отчёте (он представляет собой json-объект, превращённый в строку) содержится и имя файла-архива.
Если скачивается одна картинка, то, в принципе, можно обойтись без отчёта. Требуется как-то передать имя файла, но это можно сделать в заголовках, применив ф-ю Express'а res.attachment(). Однако мне и тут больше нравится вариант с отчётом: во-первых, единообразие упрощает код, и на сервере, и на клиенте, во-вторых, там весьма черезжопный способ извлечения имени файла из заголовка, с помощью строковых функций.

Цитата Сообщение от DrType Посмотреть сообщение
Возможно, можно сгенерировать случайную строку, достаточно длинную для того, чтобы исключить возможность случайного совпадения, которая будет известна как серверу, так и клиенту, и эту строку использовать как разделитель между Строкой_отчёта и Файлом?..
Я думал о чём-то подобном, до прихода к варианту со строкой, но, по-моему, это более затратный и ненадёжный способ.
В идеале нужен способ как-то записать Number в буфер (класс Buffer), а потом прочитать его оттуда. Но среди вариантов метода Buffer.from() я не нашёл того, что позволяет делать буфер из целого числа любой величины. Может, там есть какие-то ещё методы - пока нет времени особо вникать...
0
10.09.2021, 03:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2021, 03:36
Помогаю со студенческими работами здесь

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

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

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

ошибка PHPExcel или как скачать файл с сервера
Доброго времени суток. Я генерирю .xlsx файл библиотекой PHPExcel. Могу его сохранить на сервер без...

Как скачать файл, используя lftp?
Здравствуйте. Хочу скопировать файл с http://ftp.yandex.ru/freebsd/README.TXT c помощью утилиты...

Как используя потоки читать файл пропуская текстовые вставки
Есть поток привязанный к файлу на чтение и запись. Каждая строка в файле имеет формат: сс:мм:чч...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru