Node 實現一個MVC相簿資源管理器
阿新 • • 發佈:2019-02-11
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("成功"); }); }); }