web-dev-qa-db-ja.com

node.jsに文字列からテキストファイルを作成し、応答でストリームします

  1. Express.jsを使用しています

  2. 「Hello world!」という文字列があります

  3. ユーザーにクリックしてほしい

    <a href=/download>Download</a>
    
  4. ユーザーは、テキストを含むタブを開くのではなく、テキストを含むHello.txtダウンロードを取得する必要があります。

  5. 私はこれを達成する方法を探しましたが、それはバッファとパイプから応答へのリードストリームの作成に関係していると推測していますが、ほとんどの例は実際のファイルをディスクから読み取ることを扱っていて、ディスク、文字列から作成されたファイルで応答したいだけです。

ありがとう!

23
user1323136

私はあなたがやろうとしていることを理解していると思います。実際にディスクにファイルを作成せずに、.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タイプ の適切なリファレンスを次に示します。

32
tsturzl

これを試して:

router.get('/download', (req, res) => {
  var text = 'Hello world!'
  res.attachment('filename.txt')
  res.type('txt')
  res.send(text)
})
3
Dark Litss

これは私のために働いています!

var text="hello world";

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

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

res.send(text);
3
vijay kumar

助けてくれてありがとう、これが私がやったことです:@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();
2
user1323136