node.js--圖片上傳及顯示

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   使用   ar   for   

【介紹】

做一個demo,頁面上傳圖片和圖片名稱,然後顯示出上傳的圖片及其名稱(使用jade模板)

【問題】

1.jade模板如何安裝?

2.jade模板怎麼使用,文法規則?

3.代碼邏輯?

 

 

1.jade模板如何安裝?

jade模板的安裝很簡單,只需要在指定路徑下執行命令 npm install jade

安裝之後是這樣的(),檔案路徑下node_modules也出現jade

2.jade模板文法

jade是一個模板引擎,使用一定的文法規則寫出html頁面,並可以把變數傳入其中。寫html頁面的時候有一些規則:

(1)標籤與子標籤的關係。是通過空格來控制的,在其右側的全是它的子標籤,當往下遇到一個與其同列的標籤時,表示標籤閉合。

(2)標籤的書寫。在jade裡面,html表示的是<html></html>

(3)id和class。在jade中,普通的html語句<div id="contain" class="main other-class"></div>被改寫成

div#contain.main.other-class

(4)屬性。在jade中,屬性值是寫在括弧裡面的,像<link rel="stylesheet" href="static/style.css">被改寫成

link(rel="stylesheet", href="statc/style.css")

 

3.代碼邏輯

(1)編輯頁面index.jade和show.jade,index.jade是form表單頁面,show.jade是展現圖片頁面

index.jade

html    head        meta(charset="utf-8")        title choose a picture    body        form(ENCTYPE="multipart/form-data", action="upload", method="POST")            input(type="file" name="theImage")            input(type="submit" value="上傳圖片")

 

show.jade

html    head        meta(charset="utf-8")        title show image    body        div            p.title 圖片展示            img.image(src="#{imageURL}")

(2)邏輯處理server.js

  1.require使用到的模組。

  2.編寫伺服器,res對象添加render函數,用來解析jade,輸出頁面。

    3.路由實現。‘/‘展現index頁面,‘/upload‘處理上傳檔案並展現show頁面。

  4.編寫展現index頁面和upload函數的邏輯

var http = require(‘http‘),    url = require(‘url‘),    fs = require(‘fs‘),    querystring = require(‘querystring‘),    static_module = require(‘./node_modules/static_module/static_module‘),    jade = require(‘jade‘),    formidable = require(‘formidable‘);http.createServer(function(req, res){    res.render = function(jadeTemplate, options){        var str = fs.readFileSync(jadeTemplate, ‘utf8‘);        var fn = jade.compile(str, {filename: jadeTemplate, pretty : true});        var page = fn(options);        res.writeHead(200, {‘Content/type‘ : ‘text/html‘}); //輸出頁面        res.end(page);    };    var pathname = decodeURI(url.parse(req.url).pathname);    if(pathname == ‘favicon.ico‘){        return;    }    switch(pathname){        case ‘/‘:            showIndex(req, res);            break;        case ‘/upload‘:            upload(req, res);            break;        default:            static_module.getStaticFile(pathname, res, req);    }    function showIndex(req, res){        res.render(‘index.jade‘, {});    };    function upload(req, res){        var form = new formidable.IncomingForm();        form.parse(req, function(error, fields, files){            var fileName = Date.parse(new Date()) + ‘-‘ + files.theImage.name;            fs.renameSync(files.theImage.path, __dirname + ‘/uploadFile/‘ + fileName);            res.render(‘show.jade‘, {‘imageURL‘ : ‘/uploadFile/‘ + fileName});        });    };}).listen(1337);

 

 static_module模組邏輯:

/** * * 定義全域常用變數 */var BASE_DIR = __dirname,    CONF     = BASE_DIR + ‘/conf/‘,    STATIC   = __dirname + ‘/../..‘,    CACHE_TIME = 60*60*24*365,    mmieConf;/** * * require本模組需要的Node.js模組 */var sys = require(‘util‘),    http = require(‘http‘),     fs    = require(‘fs‘),    url   = require(‘url‘),    path  = require(‘path‘);    mmieConf = getMmieConf();/** * * 響應靜態資源請求 * @param string pathname * @param object res * @return null */exports.getStaticFile = function(pathname, res, req){    var extname = path.extname(pathname);    extname  = extname  ? extname.slice(1) : ‘‘;    var realPath = STATIC + pathname;console.info(realPath);    var mmieType = mmieConf[extname] ? mmieConf[extname] : ‘text/plain‘;    fs.exists(realPath, function (exists) {        if (!exists) {            res.writeHead(404, {‘Content-Type‘: ‘text/plain‘});            res.write("This request URL " + pathname + " was not found on this server.");            res.end();        } else {            var fileInfo = fs.statSync(realPath);            var lastModified = fileInfo.mtime.toUTCString();            /* 設定緩衝 */            if ( mmieConf[extname]) {                var date = new Date();                date.setTime(date.getTime() + CACHE_TIME * 1000);                res.setHeader("Expires", date.toUTCString());                res.setHeader("Cache-Control", "max-age=" + CACHE_TIME);            }            if (req.headers[‘if-modified-since‘] && lastModified == req.headers[‘if-modified-since‘]) {                    res.writeHead(304, "Not Modified");                    res.end();            } else {                                    fs.readFile(realPath, "binary", function(err, file) {                        if (err) {                            res.writeHead(500, {‘Content-Type‘: ‘text/plain‘});                            res.end(err);                        } else {                        res.setHeader("Last-Modified", lastModified);                        res.writeHead(200, {‘Content-Type‘: mmieType});                        res.write(file, "binary");                        res.end();                    }             });          }        }      });}//擷取MMIE配置資訊,讀取設定檔function getMmieConf(){    var routerMsg = {};    try{        var str = fs.readFileSync(CONF + ‘mmie_type.json‘,‘utf8‘);        routerMsg = JSON.parse(str);    }catch(e){        sys.debug("JSON parse fails")    }    return routerMsg;}

 

 

另外:

(1)使用了靜態檔案管理模組 ./static_module.js,根據路徑來讀取到靜態檔案。

(2)圖片的獲得使用了formidable模組。

var formidable = require(‘formidable‘);var form = new formidable.IncomingForm(); //不知道這是幹啥的,就是new了一個formidable.IncomingForm()對象form.parse(req, function(error, fields, files){//非同步回調    console.info(files.image, files.image.path,files.image.name);    //依次是圖片檔案,圖片檔案路徑,圖片檔案名稱});

(3)上傳檔案,form表單應該設定屬性ENCTYPE="multipart/form-data"

node.js--圖片上傳及顯示

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.