Создайте текстовый файл в node.js из строки и передайте его в ответ

1) Я использую express.js

2) У меня есть строка "Hello world!"

3) Я хочу, чтобы пользователь нажал

<a href=/download>Download</a>

4) Пользователь должен получить загрузку Hello.txt с текстом в нем, НЕ открывать вкладку с текстом.

5) Я искал способы достижения этого, я предполагаю, что он имеет какое-то отношение к созданию потоков обращений от буфера и трубопроводов к ответу, но большинство примеров касалось чтения реальных файлов с диска, я не хочу для чтения с диска, я просто хочу ответить файлом, созданным из строки.

Спасибо!

Ответы

Ответ 1

Думаю, я понимаю, что вы пытаетесь сделать. Вы хотите отправить файл .txt клиенту, фактически не создав файл на диске.

Это на самом деле довольно простой и очень простой. Все, что вам нужно сделать, - установить свой тип MIME в заголовке, однако большинство браузеров не загружают файлы .txt по умолчанию. Они просто открывают и отображают содержимое.

var text={"hello.txt":"Hello World!","bye.txt":"Goodbye Cruel World!"};
app.get('/files/:name',function(req,res){
   res.set({"Content-Disposition":"attachment; filename=\"req.params.name\""});
   res.send(text[req.params.name]);
});

В качестве будущей заметки вы можете отправлять любые данные, хранящиеся в виде переменной. Например, если у вас есть буфер, загруженный изображением, вы можете отправить его таким же образом, просто изменив Content-Type, иначе браузер не имеет представления о том, какие данные вы отправляете, и, я считаю, устанавливает тип по умолчанию для text/html. Вот хорошая ссылка на Типы интернет-СМИ и типы MIME.

Ответ 2

Спасибо за помощь, ребята, вот что я в итоге: @aaron, есть ли способ для работы во всех браузерах?

res.setHeader('Content-disposition', 'attachment; filename=theDocument.txt');
res.setHeader('Content-type', 'text/plain');
res.charset = 'UTF-8';
res.write("Hello, world");
res.end();

Ответ 3

это работает на меня!

var text="hello world";

res.setHeader('Content-type', "application/octet-stream");

res.setHeader('Content-disposition', 'attachment; filename=file.txt');

res.send(text);