やあみんな。NodeJS楽しいよねまじで。
今日はおじさんはExpressとか使わずにNodeJSだけでファイルをダウンロードできるサイトを構築するための最小限コードをメモしようと思うぞ。(Expressを使っているお友達はres.download()が使えるのでこの記事に用はないはずさ。この記事に用があるのはきっと何か特殊な事情があるお友達だけだと思ってる。(ようこそ!そういうお友達!おじさんもみんなの仲間だよ!))
それではさっそくやっていきましょう。
●まずはユーザーの目に触れる表側。サイトのページを作ろう。
例えば以下のようなHTMLを用意しよう。(部分によってコメントの文法表記が違うから面白いとおもうのはおじさんだけかな?(笑)青い字の部分な。)
<html lang="ja"> <meta charset="utf-8"> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control"content="no-cache"> <head> <style> /* スタイルシートコードを記述 */ </style> </head> <body> <!--HTML部品を設置--> <h1 id="hello">My公式サイト</h1> <a href="/hello_dlreq" >hoge_file.7z(最新版)</a> <script type="text/javascript"> // 必要に応じてプログラムを記述 </script> </body> </html>
これを、some_index.htmlとして保存しよう。
●次に裏側のしかけ。サーバーサイドを記述しよう。
さあそして、サーバーにリクエストが来た場合の処理を記述した、サーバーサイドjavascriptのプログラムを書いていこう。それは以下のようなものになるよ。
const http = require('http'); const server = http.createServer(); const fs = require("fs"); server.on("request", (req, res) => { if (req.url.endsWith('/')) { // 用意したHTMLファイルを描画 fs.readFile("./some_index.html", function(e, buff){ res.writeHead(200, {'Content-Type': 'text/html'}); res.write(buff.toString()); res.end(); }); } else if (req.url.endsWith('_dlreq')) { // some_index.html中の<a>タグリンクが押された時にダウンロード開始してあげる処理 // 日本語ファイル名もいけるかな?→それは試してみてくれよな! var FileName = "hoge_file.7z"; res.setHeader('Content-Disposition', 'attachment;filename*=UTF-8\'\'' + FileName); var filepath1 = __dirname + '/some_folder/'+FileName; fs.createReadStream(filepath1).pipe(res);; } }); server.listen(3000, () => console.log('Server http://localhost:3000'));
これを、some_server.js として保存しよう。
あとは、some_folderというフォルダを作成し、その中に、みんなが今ダウンロードさせたいと思っているファイル、hoge_file.7zを置こう。
フォルダ構成はこんな感じになるぞ。
│ some_index.html │ some_server.js └─some_folder/ hoge_file.7z
はい!まずは以上!。どうだえらくシンプルでまさに最小コードという感じじゃないかこれ。さらに説明が必要だと感じたときにはまた追記したいと思います。
ではまたな、チャオ!