node.js--图片上传及显示

【介绍】

做一个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"

时间: 2024-11-10 07:07:18

node.js--图片上传及显示的相关文章

node.js图片上传

1.node-formidable 对文件上传提供帮助的组件 2.app.js var formidable = require('formidable'); var http = require( 'http' ); var sys = require('sys'); http.createServer(function( request ,response ){ if( request.url == '/upload' && request.method.toLowerCase() =

multer/express/node.js图片上传实例

前端 <form enctype="multipart/form-data" method="post"> <input type="file" id="avatar" name="avatar" /> <button>提交</button> </form> <script> $('button').click(function ()

js图片上传验证图片格式和大小尺寸

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> function getImageSize(obj){ var _file=document.getElementById("file

【Servlet】利用Servlet3.0标准与JSTL表达式实现文件上传系统,支持图片上传后显示

伴随着JDK1.6一起出现的Servlet3.0标准,使得JSP的文件上传系统不再艰难,此前在JSP的文件上传系统需要<[Jsp]使用jspsmartupload完成简单的文件上传系统>(点击打开链接)类似这样的插件才能完成的文件上传系统,还不支持中文,使得各位程序猿掏空心思才能解决这个问题.现在Servlet3.0对文件上传的方法进行封装,无须分块就可以实现.而且Servlet3.0还不用类似<[Servlet]最简单的Servlet JavaWeb程序>(点击打开链接)在web

图片上传即时显示javascript代码

1.首先是javascript代码 /** * 图片上传即时显示javascript */ var allowExt = [ 'jpg', 'gif', 'bmp', 'png', 'jpeg' ]; var preivew = function(file, container) { try { var pic = new Picture(file, container); } catch (e) { alert(e); } }; // 缩略图类定义 var Picture = function

图片上传及显示(包含多文件)

前一段时间用到文件上传,好久没有写这个东西,有的东西也忘记了.所以本篇博客BZ决定记载一下,一方面自己回顾加深一下,另一方面供各位程序员学习. 希望大神们对本文不对的地方进行批评指正! 先在我们的html页面写上上传文件的文本框及图片显示所在的DIV,如下: 1 <div class="form-group"> 2 <label class="col-sm-2 control-label no-padding-right" id="lb_

MVC图片上传并显示缩略图

前面已经说了怎么通过MVC来上传文件,那么这次就说说如何上传图片然后显示缩略图,这个的实用性还是比较大.用UpLoad文件夹来保存上传的图片,而Temp文件夹来保存缩略图,前面文件上传部分就不再重复了,不过图片上传当然只能是图片格式的文件,因此在之前那篇博客中 通过控制格式的上传便能防止恶意上传,这个是文件上传的教程链接:http://www.cnblogs.com/xmfdsh/p/3988868.html 对于数据库的设计的话就随便点: 于是用EF便自动生成了类如下: public part

JS图片上传预览插件制作(兼容到IE6)

其实,图片预览功能非常地常见.很意外,之前遇到上传图片的时候都不需要预览,也一直没有去实现过.现在手上的项目又需要有图片预览功能,所以就动手做了一个小插件.在此分享一下思路. 一.实现图片预览的一些方法. 了解了一下,其实方法都是大同小异的.大概有以下几种方式: ①订阅input[type=file]元素的onchange事件. 一旦选择的路径被改变就把图片上传至服务器,然后就返回图片在服务器端的地址,并且赋值到img元素上. 缺点:工作量大,有些上传并不是用户最终需要上传的图片,但是这种方式会

android自定义View实现图片上传进度显示(仿手机QQ上传效果)

首先看下我们想要实现的效果如下图(qq聊天中发送图片时的效果): 再看一下我实现的效果: 1.效果已经看见了,下面我们来实现它.首先我创建一个android工程ProgressImageView.然后我们重写ImageView控件,创建ProcessImageView类代码如下: package com.example.processimageview; import android.annotation.SuppressLint; import android.content.Context;

来之不易的js图片上传预览代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getS