node案例———小小相册

整体采用mvc模式:
controller文件夹中定义控制js,models文件夹中定义基本操作函数js,views文件夹中定义页面模板。通常models中定义一些操作函数,在controller调用这些函数实现一些功能,同时在pulic文件夹中定义一些静态资源文件,对外进行暴露,uploads文件夹中存放文件。

在主模块上创造服务器:

var express=require("express");
var ruture=require("./controller/ruture.js");
var app=express();
app.set("view engine","ejs");
app.use(express.static("./public"));       //定义静态资源文件,在路由中有请求时会在静态资源中获取
app.use(express.static("./uploads"));
app.get("/",ruture.showtudir);
app.get("/up",ruture.showup);
app.get("/:dirname",ruture.showdir);
app.post("/up",ruture.dopost);
app.listen(3000,"127.0.0.1");

使用中间件,需要在函数定义时添加next参数,当需要继续向下只用中间件调用next()函数
controller模块:
ruturn.js:

var files = require("../models/files.js");
var express = require("express");
var formidable = require("formidable");
var sd = require("silly-datetime");
var path=require("path");
var fs=require("fs");
var app = express();
app.set("view engine", "ejs");
exports.showtudir = function(req, res) {
	files.gettudir(function(err, arr) {       //获取所有文件夹对页面进行渲染
		if(err) {
			res.send(err);
			return;
		}
		res.render("index", {
			"tudir": arr
		})
	})
}
exports.showdir = function(req, res) {
	var dirname = req.params.dirname;
	files.gettu(dirname, function(err, allimages) {       //根据文件夹名获取所有图片
		if(err) {                                       //将要渲染的内容采用回调函数进行传输,保证数据获取的完整性
			res.render("err", {
				"err": err,
			});
			return;
		}
		res.render("images", {
			"dirname": dirname,
			"allimages": allimages
		})
	})
}
exports.showup = function(req, res) {
	files.gettudir(function(err, arr) {
		if(err) {
			res.send(err);
			return;
		}
		res.render("up", {
			"tudir": arr
		})
	})
}
exports.dopost = function(req, res) {
	var form = new formidable.IncomingForm();
	form.uploadDir = path.normalize(__dirname+"/../uploads/");
	form.parse(req, function(err, fileds, files) {
		var time = sd.format(new Date(), "YYYYMMDDHHmmss");
		var ran = Math.floor(Math.random() * 89999) + 10000;
		var extname = path.extname(files.tupian.name);
		var dirname=fileds.dirname;
		var oldpath =files.tupian.path;
		var newpath =path.normalize(__dirname+"/../uploads/"+dirname+"/"+time+ran+extname);
        var size=parseInt(files.tupian.size);
        if(err){
        	return;
        }
        if(size==0){
        	res.send("未选择图片");
      	    fs.unlinkSync(oldpath);
        	return;
        }
		fs.rename(oldpath, newpath, function(err) {
			if(err) {
				res.send("改名失败");
				return;
			}
			res.send("成功");
		})
	})
}

在models模块:
files.js:

var fs=require("fs");
exports.gettudir=function(callback){
	fs.readdir("./uploads",function(err,files){
		if(err){
			callback("没有找到uploads文件夹",null);
			return;
		}
		var arr=[];
		(function die(i){                     //采用立即执行函数可以确保文件夹已经获取完毕才执行渲染工作
			if(i==files.length){
				callback(err,arr);
				return;
			}
			fs.stat("./uploads/"+files[i],function(err,stats){
				if(err){
					callback("没有找到文件夹"+files[i],null);
					return;
				}
				if(stats.isDirectory()){     //判断是否为文件夹
					arr.push(files[i]);
				}
				die(i+1);
			})
		})(0)
	})
}
exports.gettu=function(dirname,callback){
	fs.readdir("./uploads/"+dirname,function(err,files){
		if(err){
			callback("没有找到"+dirname+"文件夹",null);
			return;
		}
		var arr=[];
		(function die(i){
			if(i==files.length){
				callback(err,arr);
				return;
			}
			fs.stat("./uploads/"+dirname+"/"+files[i],function(err,stats){
				if(err){
					callback("没有找到文件"+files[i],null);
					return;
				}
				if(stats.isFile()){                      //判断是否是文件
					arr.push(files[i]);
				}
				die(i+1);
			})
		})(0)
	})
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值