整体采用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)
})
}