您的位置:首页 > Web前端 > Node.js

一个简单的基于nodejs的静态文件服务器

2016-07-05 00:00 676 查看
摘要: 简单静态文件服务器,支持列目录

Python里面有个简单的命令
python -m SimpleHTTPServer
,但不支持目录访问,所以自己捣鼓了一个。用了很久了,放这儿存档。

var http = require('http'),
url = require('url'),
path = require('path'),
fs = require('fs'),
util = require('util'),
querystring = require('querystring');
var rootpath = process.cwd();
var MIMETYPES = {
'css' : 'text/css',
'htm' : 'text/html',
'html': 'text/html',
'js'  : 'application/javascript',
'ico' : 'image/x-icon',
'jpg' : 'image/jpeg',
'png' : 'image/png',
'mp3' : 'audio/mp3',
'ogg' : 'audio/ogg',
'plist':'text/xml'
};

http.createServer(function(req, res) {
if (req.method !== 'GET') {
console.log(req.method, req.url);
req.setEncoding("utf8");
req.addListener("data", function (postDataChunk) {
//console.log(postDataChunk);
console.log(querystring.parse(postDataChunk));
});
req.addListener("end", function () {
res.writeHead(400);
res.write('GET Only.');
res.end();
});
return;
}
if (req.url === '/favicon.ico') {
console.log(req.headers);
res.write('');
res.end();
return;
}
var request_time = process.hrtime()[1];
var filename = decodeURIComponent(path.join(rootpath, url.parse(req.url).pathname));
//console.log(req.url, url.parse(req.url), filename, rootpath);
if ('/jsonp' === req.url.slice(0, 6)) {
var callback = url.parse(req.url).search.split('jsonp=')[1];
res.write(callback + '({abc:123})');
res.end();
return;
}

fs.stat(filename,function(err,fstats){
if (err) {
if ('.map' !== req.url.slice(-4)) {
var rurl = url.parse(req.url);
console.log('404', rurl.pathname);
rurl.search && console.log(querystring.parse(rurl.search.slice(1)));
}
res.writeHead(404);
res.write('Not Found');
res.end();
return;
}
if(fstats.isFile() && filename.indexOf(rootpath) == 0){
var ext = path.extname(filename).toLowerCase().slice(1);
console.log("sending file %s ",filename, ext);
res.writeHead(200, {'Content-Type': MIMETYPES[ext] || "application/octet-stream"});
fs.createReadStream(filename).pipe(res);
}else{
res.writeHead(200, {'Content-Type': 'text/html'});
res.write("<!DOCTYPE html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><title>文件列表</title><body><h2>文件列表</h2><br>");
fs.readdir(filename,function(err,files){
if(files.length == 0 || err){
res.write("No files available.");
}else{
var i, p;
res.write("<table border='2px' cellpadding='5px'><tr><td><b>文件名</b></td><td><b>大小</b></td></tr>");
for(i = 0; i < files.length; i++){
p = path.join(filename,files[i]);
res.write(util.format("<tr><td><a href='\%s'>%s</a></td><td> %d kb </td></tr>",p.slice(rootpath.length),files[i],fs.lstatSync(p).size / 1000.0));
};
res.write("</table>");
}
var end_time = process.hrtime()[1];
res.write(util.format("<br><br><small>Page build in %dms nodejs %s</body></html>", (end_time - request_time) / 1e6, process.version));
res.end();
});
}
});
}).listen(7000);

console.log("server listening on port 7000");

参考链接:http://norbertfischer.org/Simple_nodejs_file_server
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  staticserver nodejs