转自:http://blog.csdn.net/zxsrendong/article/details/16804867
?
在开始之前,应该好好规划一下项目的文件目录了。我的目录结构如下:
assets放置网站的静态文件css,js,img等;common存放项目的配置文件和一些通用文件;server存放服务处理文件,将要创建的静态文件服务就是放在此目录中; tpl放置的是模板文件也就是网页文件。
文件的下载格式主要是由'Content-Type'的值决定的,要想下载的文件能够正常工作就应该正确的设置不同文件的'Content-Type'值。mime.js文件存放了一些常用mime值:
- exports.mime?=?{??
- ????"html"?:?"text/html",??
- ????"css"??:?"text/css",??
- ????"js"???:?"text/javascript",??
- ????"json"?:?"application/json",??
- ????"ico"??:?"image/x-icon",??
- ????"gif"??:?"image/gif",??
- ????"jpeg"?:?"image/jpeg",??
- ????"jpg"??:?"image/jpeg",??
- ????"png"??:?"image/png",??
- ????"pdf"??:?"application/pdf",??
- ????"svg"??:?"image/svg+xml",??
- ????"swf"??:?"application/x-shockwave-flash",??
- ????"tiff"?:?"image/tiff",??
- ????"txt"??:?"text/plain",??
- ????"wav"??:?"audio/x-wav",??
- ????"wma"??:?"audio/x-ms-wma",??
- ????"wmv"??:?"video/x-ms-wmv",??
- ????"xml"??:?"text/xml"??
- };??
先来看server.js和FServer.js的类容:
?
?
- //??server.js????
- ????var?config?=?require('./common/config');????
- ????var?http???=?require('http');????
- ????var?fs?????=?require('fs');????
- ????var?url????=?require('url');????
- ????var?path???=?require('path');????
- ????var?FServer???=?require('./server/FServer');????
- ????function?index(){????
- ????????var?indexPath?=?config.ui?+?'/index.html';????
- ????????fs.exists(indexPath,?function(exists){????
- ????????????if(?!exists?)?{????
- ????????????????throw?err;????
- ????????????}?else?{????
- ????????????????fs.readFile(indexPath,?function(err,?data){????
- ????????????????????if?(err)?{????
- ????????????????????????throw?err;??????
- ????????????????????}?else?{????
- ????????????????????????function?onRequest(req,?res){????
- ????????????????????????????//?取得文件路径????
- ????????????????????????????var?pathname?=?url.parse(req.url).pathname;????
- ????????????????????????????//?获取文件扩展名(包含前置.)????
- ????????????????????????????var?extname?=?path.extname(?pathname?);????
- ????????????????????????????var?type?=?extname.slice(1);????
- ????????????????????????????//?获取下载文件在磁盘上的路径,????
- ????????????????????????????var?realPath?=?config.root?+?pathname;????
- ????????????????????????????if?(?extname?===?''?)?{????
- ????????????????????????????????res.writeHead(200,?{'Content-Type':'text/html'});????
- ????????????????????????????????res.write(data);????
- ????????????????????????????????res.end();????
- ????????????????????????????}?else?{????
- ????????????????????????????????FServer.filesLoad(realPath,?type,?req,?res);????
- ????????????????????????????}????
- ????????????????????????}????
- ????????????????????????http.createServer(onRequest).listen(config.port);????
- ????????????????????}????
- ????????????????})????
- ????????????}????
- ????????})????
- ?????}????
- ????exports.index?=?index;????
- ????
- ????//?FServer.js????
- ????var?fs???=?require('fs');????
- ????var?mime?=?require('../common/mime').mime;????
- ????function?filesLoad(filePath,?type,?req,?res){????
- ????????fs.exists(filePath,?function(exists){????
- ????????????if?(?!exists?)?{????
- ????????????????res.writeHead(404,?{'Content-Type':?'text/plain'});????
- ????????????????//?res.write();????
- ????????????????res.end();????
- ????????????}?else?{????
- ????????????????fs.readFile(filePath,?'binary',?function(err,?file){????
- ????????????????????if?(?err?)?{????
- ????????????????????????res.writeHead(500,?{'Content-Type':?'text/plain'});????
- ????????????????????????//?res.write();????
- ????????????????????????res.end();????
- ????????????????????}?else?{????
- ????????????????????????res.writeHead(200,?{'Content-Type':?mime[type]});????
- ????????????????????????res.write(file,?'binary');????
- ????????????????????????res.end();????
- ????????????????????}????
- ????????????????});????
- ????????????}????
- ????????})????
- ????}????
- ????exports.filesLoad?=?filesLoad;????
上面引入了nodejs的内置模块http、fs、url、path,config和FServer是自定义模块,要读取文件首先要知道文件在磁盘上是否存在,还应当知道文件的类型才能达到想要的效果。运行程序可以发现css和javascript都下载正确,并且css效果在页面上正确渲染(javascript还没有写效果)
?
?