1 | ||||||
Как, используя потоки Node, скачать с сервера файл + отдельную строку?08.09.2021, 16:33. Показов 1772. Ответов 5
Всем привет.
Задача такова: клиент отправляет через fetch() запрос на скачивание файла с сервера. Нужно отправить ему файл + некую строку с отчётом о проделанной операции. В скачивании файла ничего трудного нет:
0
|
08.09.2021, 16:33 | |
Ответы с готовыми решениями:
5
Как скачать файл с http сервера, если директория неизвестна? Через командную строку Текстовый файл. В новый файл перенести каждое слово как отдельную строку. В новый файл перенести каждое слово как отдельную строку Как скачать файл с сервера Как скачать файл с ftp сервера? |
10.09.2021, 00:14 [ТС] | 3 | |||||
Я в итоге стал использовать res.write().
Раз уж зашла речь об отправке файла + строки, поделюсь, как реализовал это. В общем, в ответе нужно передать непрерывную последовательность бинарных данных, представляющих собой СтрокаСДлинойСтрокиОтчёта + СтрокаОтчёта + Файл. На клиенте всё это дело будет распарсиваться - сначала получат длину строки отчёта, потом, зная её, выцепят сам отчёт, а потом, отсоединив файл от всего этого, предоставят браузеру его сохранить где-то там у себя в "Загрузках". Проблема вышла с передачей длины отчёта, поскольку хз, какова будет эта длина, и сколько байтов займёт выражающее её число (а не зная, сколько байтов, как клиент его получит?). Может, я просто ещё неуч, но я так и не нашёл способ это выяснить и в итоге решил задать, что СтрокаСДлинойСтрокиОтчёта всегда состоит из 10 символов - т.е., 10 байт в кодировке utf8. Если длина отчёта менее, чем десятизначная (да уж наверное!), оставшиеся места заполняются пробелами. Клиент там у себя срежет их через trim(). Если знаете, как сделать лучше - буду рад подсказке) В итоге получилось примерно следующее:
0
|
10.09.2021, 00:56 | 4 |
Возможно, можно сгенерировать случайную строку, достаточно длинную для того, чтобы исключить возможность случайного совпадения, которая будет известна как серверу, так и клиенту, и эту строку использовать как разделитель между Строкой_отчёта и Файлом?..
0
|
123 / 98 / 15
Регистрация: 02.02.2014
Сообщений: 346
|
|
10.09.2021, 01:10 | 5 |
А клиенту прямо на скачивание отдавать? если чтобы просто показать, может тогда проще каким base_64 и всё это в json
0
|
10.09.2021, 03:36 [ТС] | 6 |
Честно говоря, не понял, что вы хотели сказать.
Да, речь идёт именно о скачивании. Есть сайт с хранилищем картинок, юзер имеет возможность их скачивать. Если он хочет скачать одну картинку, отдаём её саму, если больше одной - создаём на сервере zip-архив из нужных картинок и отдаём его. Вот тут и нужен отчёт, т.к., в теории, могут быть ошибки при создании архива (например, не все файлы удалось добавить), и клиенту надо об этом сообщить. Плюс, в отчёте (он представляет собой json-объект, превращённый в строку) содержится и имя файла-архива. Если скачивается одна картинка, то, в принципе, можно обойтись без отчёта. Требуется как-то передать имя файла, но это можно сделать в заголовках, применив ф-ю Express'а res.attachment(). Однако мне и тут больше нравится вариант с отчётом: во-первых, единообразие упрощает код, и на сервере, и на клиенте, во-вторых, там весьма черезжопный способ извлечения имени файла из заголовка, с помощью строковых функций. Я думал о чём-то подобном, до прихода к варианту со строкой, но, по-моему, это более затратный и ненадёжный способ. В идеале нужен способ как-то записать Number в буфер (класс Buffer), а потом прочитать его оттуда. Но среди вариантов метода Buffer.from() я не нашёл того, что позволяет делать буфер из целого числа любой величины. Может, там есть какие-то ещё методы - пока нет времени особо вникать...
0
|
10.09.2021, 03:36 | |
10.09.2021, 03:36 | |
Помогаю со студенческими работами здесь
6
Как правильно скачать файл с FTP сервера Как скачать файл размером 11 Мб с FTP-сервера? Как скачать файл с кодом рнр, с сервера? ошибка PHPExcel или как скачать файл с сервера Как скачать файл, используя lftp? Как используя потоки читать файл пропуская текстовые вставки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |