日期:2014-05-16  浏览次数:20450 次

基于Node.js的简单文件服务器
最近看了下Node.js,基于V8的服务端javascript,有点意思,就写了个简单的文件夹系统,用于列出系统的某个文件夹下的文件,并可以实现下载。不过对于比较大的文件,可能会有点问题。。Node.js一般在linux下运行,附件是基于cygwin的版本,可以测试下 ,运行方式为node filesystem.js。cygwin版本的node.js有人已经上传了,见地址http://dl.iteye.com/topics/download/996e51ce-7489-3dfe-a38b-01ee2a7c4d9d




贴下代码:
/***
 * @author flyingzl
 * @date 2010-11-27
 * 一个基于Node.js的简单文件服务器
 */

var fs=require("fs"),
	http=require("http"),
	url=require("url"),
	path=require("path"),
	mime=require("./mime").mime,
	util=require('util');

//www根目录
var root=__dirname,
	host="127.0.0.1",
	port="8888";
	
	
if(!path.existsSync(root)){
	util.error(root+"文件夹不存在,请重新制定根文件夹!");
	process.exit();
}
	
//显示文件夹下面的文件
function listDirectory(parentDirectory,req,res){
	fs.readdir(parentDirectory,function(error,files){
		var body=formatBody(parentDirectory,files);
		res.writeHead(200,{
			"Content-Type":"text/html;charset=utf-8",
			"Content-Length":Buffer.byteLength(body,'utf8'),
			"Server":"NodeJs("+process.version+")"
		});
		res.write(body,'utf8');
		res.end();
	});

}

//显示文件内容
function showFile(file,req,res){
	fs.readFile(filename,'binary',function(err,file){
		var contentType=mime.lookupExtension(path.extname(filename));
		res.writeHead(200,{
			"Content-Type":contentType,
			"Content-Length":Buffer.byteLength(file,'binary'),
			"Server":"NodeJs("+process.version+")"
		});
		res.write(file,"binary");
		res.end();
	})
}

//在Web页面上显示文件列表,格式为<ul><li></li><li></li></ul>
function formatBody(parent,files){
	var res=[],
		length=files.length;
	res.push("<!doctype>");
	res.push("<html>");
	res.push("<head>");
	res.push("<meta http-equiv='Content-Type' content='text/html;charset=utf-8'></meta>")
	res.push("<title>Node.js文件服务器</title>");
	res.push("</head>");
	res.push("<body width='100%'>");
	res.push("<ul>")
	files.forEach(function(val,index){
		var stat=fs.statSync(path.join(parent,val));
		if(stat.isDirectory(val)){
			val=path.basename(val)+"/";
		}else{
			val=path.basename(val);
		}
		res.push("<li><a href='"+val+"'>"+val+"</a></li>");
	});
	res.push("</ul>");
	res.push("<div style='position:relative;width:98%;bottom:5px;height:25px;background:gray'>");
	res.push("<div style='margin:0 auto;height:100%;line-height:25px;text-align:center'>Powered By Node.js</div>");
	res.push("</div>")
	res.push("</body>");
	return res.join("");
}

//如果文件找不到,显示404错误
function write404(req,res){
	var body="文件不存在:-(";
	res.writeHead(404,{
		"Content-Type":"text/html;charset=utf-8",
		"Content-Length":Buffer.byteLength(body,'utf8'),
		"Server":"NodeJs("+process.version+")"
	});
	res.write(body);
	res.end();
}

//创建服务器
http.createServer(function(req,res){
	//将url地址的中的%20替换为空格,不然Node.js找不到文件
	var pathname=url.parse(req.url).pathname.replace(/%20/g,' '),
		re=/(%[0-9A-Fa-f]{2}){3}/g;
	//能够正确显示中文,将三字节的字符转换为utf-8编码
	pathname=pathname.replace(re,function(word){
		var buffer=new Buffer(3),
			array=word.split('%');
		array.splice(0,1);
		array.forEach(function(val,index){
			buffer[index]=parseInt('0x'+val,16);
		});
		return buffer.toString('utf8');
	});
	if(pathname=='/'){
		listDirectory(root,req,res);
	}else{
		filename=path.join(root,pathname);
		path.exists(filename,function(exists){
			if(!exists){
				util.error('找不到文件'+filename);
				write404(req,res);
			}else{
				fs.stat(filename,function(err,stat){
					if(stat.isFile()){
						showFile(filename,req,res);
					}else if(stat.isDirectory()){
						listDirectory(filename,req,res);
					}
				});
			}
		});
	}
	
	
}).listen(port,host);

util.debug("服务器开始运行 http://"+host+":"+port)




接下来是mime.js,一个用于显示文件类型的js文件
var mime = {

  //查找文件后缀