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

设计了一个可用的Node.js文件服务器.md

2017-08-16 20:45 519 查看
最近跟着自己家人学了Node.js和PHP,觉得服务器技术简单实用很好玩。

文件服务器如果纯用C/C++写的话真心很麻烦,Node.js却十分容易。

不写不知道学不会,还是写一个吧。:)

/*
2017年8月16日星期三 18:51
Node.js文件服务器:可以通过远程访问目标电脑文件。
author:dalerkd
特点:
支持中文路径
支持返回上一层

基础代码参考自:http://www.cnblogs.com/fengfengtk/p/4001985.html
作者:天空中的蜂蜂
原来的代码不能浏览多级目录,不能下载文件,不能阅读和下载路径或者文件名的内容。
所以我重点解决了这些问题。让它能用了。

*/
//文件大小单位自动转换
//来自http://blog.csdn.net/fengshizty/article/details/26226593 作者Andyzty
function sizeConver(limit){
var size = "";
if( limit < 0.1 * 1024 ){ //如果小于0.1KB转化成B
size = limit.toFixed(2) + "B";
}else if(limit < 0.1 * 1024 * 1024 ){//如果小于0.1MB转化成KB
size = (limit / 1024).toFixed(2) + "KB";
}else if(limit < 0.1 * 1024 * 1024 * 1024){ //如果小于0.1GB转化成MB
size = (limit / (1024 * 1024)).toFixed(2) + "MB";
}else{ //其他转化成GB
size = (limit / (1024 * 1024 * 1024)).toFixed(2) + "GB";
}

var sizestr = size + "";
var len = sizestr.indexOf("\.");
var dec = sizestr.substr(len + 1, 2);
if(dec == "00"){//当小数点后为00时 去掉小数部分
return sizestr.substring(0,len) + sizestr.substr(len + 3,2);
}
return sizestr;
}

var http = require("http");
var url = require("url");
var fs = require("fs");
var server = http.createServer(function(req, res){
var req_path = url.parse(req.url).path;
console.log("Log: "+req_path);

var decodePath = decodeURI(req_path);//chinese or space or other char
var filepath = __dirname + decodePath;

filepath = filepath.replace(/\//g,'\\');//不转也可以,但为了斜线的一致

console.log('Debug '+filepath);

fs.exists(filepath, function(exists)
{
console.log('Debug '+exists);
if(exists)
{
fs.stat(filepath, function(err, stats)
{
if(err)
{
res.writeHead(500, {'Content-Type' : 'text/html;charset=utf8'});
res.end('<div styel="color:black;font-size:22px;">server error</div>');
}else{
if(stats.isFile())
{
let file = fs.createReadStream(filepath);
res.writeHead(200, {'Content-Type' : 'application/octet-stream'});
file.pipe(res);
}else{
fs.readdir(
filepath, function(err, files)
{
let str = '';

str += '<table><tr align="left"><th>Name</th><th>Type</th><th>Size</th></tr>';

for(let i in files)
{
/*获取文件路径,判断属性,打印属性*/

var rootPath='';
if(req_path!='/')
{
rootPath = req_path;
}

let tempFilePath = __dirname + rootPath + '/' + files[i];

str += '<tr><td>';
str += '<a href=\"'  + rootPath +'/'+ files[i] +  '\">' +  files[i] + '</a>';
str += '</td>';

//获取属性
try{//防止不存在的路径
var statesInfo = fs.statSync(tempFilePath)// function(err, stats)

str += '<td>';
if(statesInfo.isFile())
{
str += 'File';
}
else
{
str += 'Folder';
}
var tempSize=sizeConver(statesInfo.size);
str += '</td><td>'+tempSize+'</td>';
}
catch(err)
{
continue;
}
finally
{

str += '</tr>';
}

}

var fatherPath = req_path;

if(fatherPath=='')
{
fatherPath=='/'
}

var tempStart = fatherPath.indexOf('/');

if(tempStart!=0)//如果第一个字符不是'/'加上它
{
fatherPath = '/' + fatherPath;
}

if (req_path!='/')//长度一定超过2了
{
//如果最后一个字符是'/'去掉它
if('/'==fatherPath.charAt(fatherPath.length -1))
{
fatherPath = fatherPath.substring(0,fatherPath.length - 2);
}

//从后向前查找'/',提取前面的串
fatherPath = fatherPath.substring(0,fatherPath.lastIndexOf('/')+1);
}

str += '</table><br/>' + '<a href=\"'  + fatherPath +'\">' + '返回上一层' +'</a>';

res.writeHead(200, {'Content-Type' : 'text/html;charset=utf8'});
res.write(str);
res.end();
}
);
}
}
}
);
}else
{
res.writeHead(404, {'Content-Type' : 'text/html;charset=utf8'});
res.end('<div styel="color:black;font-size:22px;">404 not found</div>');
}
});
});
server.listen('9090');

//代码来自http://blog.csdn.net/fifaquake/article/details/7532145 作者fifaquake
function DisplayServiceIP(){
var os=require('os');
var ifaces=os.networkInterfaces();
for (var dev in ifaces) {
var alias=0;
ifaces[dev].forEach(function(details){
if (details.family=='IPv4') {
console.log(dev+(alias?':'+alias:''),details.address);
++alias;
}
});
}
}

DisplayServiceIP();

console.log('ing...port: 9090')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  node.js 服务器 设计