1. 程式人生 > >Node 實現一個MVC相簿資源管理器

Node 實現一個MVC相簿資源管理器

var file = require("../models/file.js");
var formidable = require("formidable");
var path = require("path");
var fs = require("fs");
var sd = require("silly-datetime");
exports.showIndex = function (req,res,next) {
    //錯誤的,傳統的思維,不是Node的思維。
    // res.render("index",{
    //     //注意這裡非同步的,遇到阻塞,會直接呈遞模版引擎,所以這種寫法是錯誤的,小函式會沒執行完,就呈遞了
    //     "albums" : file.getAllAlbums()
    // });
    //這就是Node.js的程式設計思維,就是所有的東西,都是非同步的
    //所以,內層函式,不是return回來東西,而是呼叫高層函式提供的
    //回撥函式。把資料當做回撥函式的引數來使用。
    file.getAllAlbums(function (err,allAlbums) { //這個function就是callback
        //err是字串
        if(err) {
            next();
            return;
        }
        res.render("index",{
            "albums" : allAlbums
        });
    })
};

//相簿頁
exports.showAlbum = function (req,res,next) {
    //遍歷相簿中的所有圖片
    var albumName = req.params.albumName;
    //具體業務交給model
    file.getAllImagesByAlbumName(albumName,function (err,imagesArray) {
        if(err) {
            next();
            return;
        }
        res.render("album",{
            "albumname" : albumName,
            "images" : imagesArray
        });
    });
    
};

exports.showUp = function (req,res) {
    //命令file模組(我們自己寫的函式)呼叫getAllAlbums函式
    //得到所有資料夾名字之後做的事情,寫在回撥函式裡面
    file.getAllAlbums(function (err,albums) {
        res.render("up",{
            albums : albums
        });
    })
}

//上傳表單
exports.doPost = function (req,res) {
    var form = new formidable.IncomingForm();

        // "../"返回上一級
    form.uploadDir = path.normalize(__dirname + "/../tempup/");
    form.parse(req, function (err, fields, files,next) {
        console.log(fields);
        console.log(files);
        //改名
        if(err) {
            next(); //這個中介軟體不受理這個請求了,往下走
            return;
        };

        //判斷檔案尺寸
        var size = parseInt(files.tupian.size);
        if(size > 2000000) {
             res.send("圖片尺寸應該小於2M");

            //則刪除這個檔案
            fs.unlink("files.tupian.path",function () {

            });
            return;
        }
        var wenjianjia = fields.wenjianjia;
        var oldpath = files.tupian.path ;
        //還是加時間戳
        var ttt = sd.format(new Date(), "YYYMMDDHHmmss");
        var ran = parseInt(Math.random() * 89999 + 10000);
        var extname = path.extname(files.tupian.name);
        var newpath = path.normalize(__dirname + "/../uploads/" + wenjianjia + "/" + ttt + ran + extname);
        fs.rename(oldpath,newpath,function (err) {
            if(err) {
                res.send("改名失敗");
                return;
            }
            res.send("成功");
        });
    });


}