node.js系列笔记之node.js初识《一》

一:环境说明

  1.1 Linux系统CentOS 5.8

1.2 nodejs v0.10.15

1.3 nodejs源码下载地址 http://blog.nodejs.org/

1.4 开发工具 WebStorm6 下载地址 http://www.jetbrains.com/webstorm/whatsnew/

二:安装配置

  2.1 下载nodejs for linux (nodejs source)

2.2 nodejs安装过程中遇到的问题及解决方法 http://blog.csdn.net/code52/article/details/9036279

三:相关资料

  3.1 入门学习资料 http://www.nodebeginner.org/index-zh-cn.html#blocking-and-non-blocking

  3.2 API

3.2.1 英文API http://nodejs.org/api/

        3.2.2 中英文对照 API http://docs.cnodejs.net/cman/

四:功能说明

  4.1 参照3.1中提到的入门教程做的一个实现图片上传功能

4.2 在3.1中的学习资料中最后完成的是上传任何一张图片最后传到Linux中的都是叫test.png的图片,上传第二张图片的时候会把第一张图片替换掉

所以每次打开的都只是最新上传的那张图片

  4.3 需求分析

         在上述提到的学习资料中上传的没一张图片都命名为test.png,如果上传的图片是其他格式会不会有问题呢?假设没有问题,这样是否合理呢?

         当然作为一个初学者可能不用考虑这么多东西,但是本着发散思维,深究问题的原则,做了以下修改

4.3.1 根据上传图片的后缀名来确定上传后文件的后缀名

4.3.2 上传图片不再使用test.png来命名,而且给上传的没一张图片都重新命名(在以往的实际开发过程中我们知道,多数情况下图片上传到服务器以后都不可能

以他上传时的名称作为上传后的名称),重命名的规则是随机生成一个10位数的数字作为其文件名,当然你还可以生成更大的随即数,这样重复的概率将会

更小,此文章的重点不在这里所以不做过多解释

4.3.3 获取已经上传的图片列表

4.3.4 当在列表中单机某一张图片的名称时,打开此图片

五:具体实现

5.1 server.js 服务器模块

/**
 * @auth solarstorm
 * @email solarstorm_java@sina.cn
 * @date 2013-8-19 10:44 
 * 
 *  服务器模块
 */

//导入http模块
var http = require('http');

//导入url模块
var url = require('url');

//导入querystring模块
var queryString = require('querystring');

/**
 * @param {Object} route router模块的route方法
 */
function start(route, handle){
    function onRequest(request, response){
        //获取请求路径名称
        var path = url.parse(request.url).pathname;

//获取Get请求参数对象
        var paramObj = url.parse(request.url).query;

if (path != '/favicon.ico') {

console.log('request for'+path+' receive.');

//请求转发
            route(path, handle, response, request, paramObj);

}

}

//创建服务器对象并监听8888端口
    http.createServer(onRequest).listen(8888);

console.log('Server to Started.');
}

//输出start方法
exports.start = start;

5.2 router.js 路由模块

/**
 * 路由模块
 * @auth solarstorm
 * @email solarstorm_java@sina.cn
 * @date 2013-8-19 10:44
 * @param path  请求路径名称
 * @param handle  请求路径数组
 * @param response  浏览器相应对象
 * @param request   浏览器请求对象
 * @param paramObj  Get请求方式中获取的请求路径中(?foo=123&val=8888)的部分
 */
function route(path, handle, response, request, paramObj){
    console.log('About to route a request for ' + path);

if (typeof handle[path] === 'function') {
         handle[path](response, request, paramObj);
    }else {
        console.log("No request handler found for " + path);
    }

}

exports.route = route;

5.3 requestHandler.js 请求处理模块

/**
 * child_process : 子进程模块
 * 
 *         提供生成子进程的重要方法:child_process.spawn(command, args=[], [options])
 *     
 *         提供杀死进程的方法:child.kill(signal='SIGTERM')   
 *
 * 
 *         提供直接执行系统命令的重要方法:child_process.exec(command, [options], callback)
 *  
 *     exec的实现原理是启动了一个系统shell来解析参数,因此可以是非常复杂的命令,包括管道和重定向。
 *         此外,exec还可以直接接受一个回调函数作为参数,回调函数有三个参数,分别是error, stdout, stderr
 * 
 *         options Object
                cwd String Current working directory of the child process
                env Object Environment key-value pairs
                encoding String (Default: 'utf8')
                timeout Number (Default: 0)
                maxBuffer Number (Default: 200*1024)
                killSignal String (Default: 'SIGTERM')

return child_process object

exec('find /',function(error, stdout, stderr){
                response.writeHead(200, {'Content-Type' : 'text/plain'});
                response.write(stdout);
                response.end();
        });
 */
/**
 *  @author solarstorm
 *  @email solarstorm_java@sina.cn
 *  @date 2013-8-19 10:44
 *
 *  请求处理模块
 */
var exec = require('child_process').exec;
var queryString = require('querystring');
var fs = require('fs');
var url = require('url');
//导入文件上传需要的模块
var formidable = require('formidable');

/**
 * 生成表单
 * @param response
 */
function form(response) {
    console.log('start method...');

var body = '<html>'+
               '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />'+
               '<head>'+
               '<body>'+
               '<form action = "/upload" method="post" enctype="multipart/form-data">'+
               '<input type="file" name="upload">'+
               '<input type="submit" value="submit">'+
               '</form>'+
               '</boyd>'+
               '<head>'+
               '</html>';

response.writeHead(200, {'Content-Type' : 'text/html'});
    response.write(body);
    response.end();

}

/**
 * 上传图片处理方法
 * @param response
 * @param request
 */
function upload(response,request) {
    console.log("Request handler 'upload' was called.");

//它是对提交表单的抽象表示,通过它就可以解析request对象,获取表单中需要的数据字段
    var form = new formidable.IncomingForm();

form.parse(request,function(error,fields,files){

//生成一个10位数的随机码
        var random = Math.floor(Math.random()*10000000000);

//获取上传文件的名称,此处需要注意,这里的files.upload.name中的upload不是系统的属性,而是我们表单中name的名称
        var name = files.upload.name;

//截取文件名称找到后缀名
        var suffix = name.substr(name.indexOf('.'));

//上传文件,并修改文件名称
        fs.renameSync(files.upload.path, '/upload/'+random+suffix);

response.writeHead(200,{'Content-Type':'text/html;charset=UTF-8'});
        response.write('上传成功...');

response.end();

});

}

/**
 *  显示上传到图片库列表
 * @param {Object} response
 *
 * fs.readdir(path, [callback])
 *      异步调用readdir(3),读取目录中的内容。回调函数接受两个参数(err, files),
 *      其中files参数是保存了目录中所有文件名的数组('.'和'..'除外)
 *
 */
function displayList(response){
        
    var dir = '/upload';

fs.readdir(dir, function(error, files){
        response.writeHead(200, {"Content-Type": "text/html"});
        var len = files.length;
        for (var i = 0; i < len; i ++) {
            response.write("<a href='/displayFileByName?dir="+dir+"&img="+files[i]+"'>"+files[i]+"</a><br/>");
        }

response.end();
    });
}

/**
 *  打开某一张图片
 * @param {Object} response
 * @param {Object} request
 * @param {Object} paramObj 请求参数对象
 *
 * fs.readFile(filename, [encoding], [callback]) 异步读取一个文件的所有内容
 *        回调函数将传入两个参数(err, data),其中data为文件内容
 *        如果没有设置编码,那么将返回原始内容格式的缓冲器
 *
 */
function displayFileByName(response, request, paramObj){

//获取请求参数
    var dir = queryString.parse(paramObj)['dir'];
    var img = queryString.parse(paramObj)['img'];

fs.readFile(dir+'/'+img, 'binary', function(error, file){
        if (!error) {
            response.writeHead(200, {"Content-Type": "image/jpeg"});
            response.write(file, "binary");
            response.end();

}else{
            response.writeHead(500, {"Content-Type": "text/html"});
            response.write(error + "\n");
            response.end();
        }
    });
      
}

exports.form = form;
exports.upload = upload;
exports.displayList = displayList;
exports.displayFileByName = displayFileByName;

5.4 index.js

/**
 * @auth solarstorm
 * @email solarstorm_java@sina.cn
 * @date 2013-8-19 10:44
 */
var server = require('./server');

var router = require('./router');

var requestHandlers = require("./requestHandlers");

//定义一个路径数组,下标为请求路径,值为路径对应的请求处理方法
var handle = {};

handle['/'] = requestHandlers.form;
handle['/form'] = requestHandlers.form;
handle['/upload'] = requestHandlers.upload;
handle['/displayList'] = requestHandlers.displayList;
handle['/displayFileByName'] = requestHandlers.displayFileByName;

server.start(router.route, handle);

六:效果图

  6.1 上传界面

         

  6.2 上传成功

         

  6.3 上传图片列表

         

  6.4 打开其中一张图片

    

    

七:总结

  欢迎各位踊跃拍砖,有拍砖才有讨论,有讨论才有进步。

 
 

node.js系列笔记之node.js初识《一》的更多相关文章

  1. Vue.js 学习笔记 第1章 初识Vue.js

    本篇目录: 1.1 Vue.js 是什么 1.2 如何使用Vue.js 本章主要介绍与Vue.js有关的一些概念与技术,并帮助你了解它们背后相关的工作原理. 通过对本章的学习,即使从未接触过Vue.j ...

  2. WebGL three.js学习笔记 创建three.js代码的基本框架

    WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...

  3. node.js系列笔记之fs模块《二》

    一:感触 最近工作比较忙,感觉也比较多,因为工作上的不顺利,再加上加班比较多,所以最近心情不是很好,再加上英语能力差到不行,所以最近半个月学习进度也比较慢, 但还是告诉自己每天都坚持学一点,即使今天心 ...

  4. Node.js学习笔记(2) - Node.js安装及入门hello world

    今天来简单的记录一下Node.js的安装配置以及简单的入门 一.Node.js的安装 1.windows下的安装 windows下的安装很简单,只需要去官网http://nodejs.org中,找到w ...

  5. Node.js学习笔记(1) - Node.js简介

    近期在看一些Node.js的知识,看完后觉得,一些前面的东西忘记了,于是整理一下,方便自己查阅,也希望对学习Node.js的朋友有些帮助: 当然以下只是我个人的观点和理解,不喜勿喷,也望大神指教. 一 ...

  6. Node.js学习笔记(七) --- Node.js的静态文件托管、路 由、EJS 模板引擎、GET 、POST

    1 . Nodejs 静态文件托管静态 web 服务器封装 2 . 路由 官方解释:  路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET.POST 等)组成的, ...

  7. Node.js学习笔记(八) --- Node.js的路由模块封装

    1 .模块化的方式封装 整理中… 2 .封装仿照 express 的路由整理中…

  8. js系列(10)js的运用(二)

        本节继续介绍在html页面中js的运用.   (1)数码时钟:(http://files.cnblogs.com/files/MenAngel/text05.zip) <!DOCTYPE ...

  9. js系列(9)js的运用(一)

        本节开始介绍javascript在html页面中的运用.     (1)link样式表的动态绑定:(http://files.cnblogs.com/files/MenAngel/text04 ...

随机推荐

  1. android 数据共享

    android数据共享的各种部件中的应用是最重要的3途径: 第一.使用Application子类来实现数据共享. 例如,请看下面的例子: /**  * @author YangQuanqing 特征: ...

  2. crm创建和编辑全局选项集

    一个选项集就是可包含在一个实体中的某种类型的字段.它定义一组选项.当一个选项集显示在窗口中时,将使用下拉列表控件.当在 Advanced Find 中显示时,则使用选择列表控件.有时,开发者将选项集称 ...

  3. 常用批处理命令总结3之Find和FindStr

    原文:常用批处理命令总结3之Find和FindStr find 作用:从文件中收索字符串 格式:find 参数 "字符串" 路径\文件名 参数: /V 显示所有未包含指定字符串的行 ...

  4. Python 静态变量 与 静态方法

    静态变量: XXXClass.py: class XXXClass: CONST_Value = 10.1 Tester.py: import XXXClass print XXXClass.XXXC ...

  5. centos6的安装

      centos6的安装,一步一图,有图有真相     打开虚拟机VMware,点击文件,选择[新建虚拟机],如图所示

  6. lua及luci学习

    由于项目需要对Luci进行修改,所以这里开始地luci进行较深入的研究. 探索其中的运行路径. Openwrt默认的HTTP服务器为uhttpd,该WEB服务器是由Luci的开发者自行开发的,非常小巧 ...

  7. 笔试题&amp;面试题:CW输出矩阵

    称号:CW输出矩阵(N*N). 如果一个矩阵: 1   2   3   4 5   6   7   8 9  10 11 12 13 14 15 16 那么程序应该给出的输出为:1 2 3 4 8 1 ...

  8. Oracleclient+PLSQL Developer实现远程登录Oracle数据库

    Oracle数据库功能强大.性能卓越,在造就这些长处的同一时候,也导致Oracle占内存比較多.针对这个问题,我们怎样做到取其精华去其糟粕呢? 解决方式:我们能够在局域网内的server上安装庞大的O ...

  9. SQL Server 性能调优 之运行计划(Execution Plan)调优

    运行计划中的三种 Join 策略 SQL Server 存在三种 Join 策略:Hash Join,Merge Join,Nested Loop Join. Hash Join:用来处理没有排过序/ ...

  10. mysql 基础之CURD

    原文:mysql 基础之CURD 增删改查基本语法学习 增: insert Insert 3问: 1: 插入哪张表? 2: 插入哪几列? 3: 这几列分别插入什么值? Insert into Tabl ...