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初识《一》的更多相关文章
- Vue.js 学习笔记 第1章 初识Vue.js
本篇目录: 1.1 Vue.js 是什么 1.2 如何使用Vue.js 本章主要介绍与Vue.js有关的一些概念与技术,并帮助你了解它们背后相关的工作原理. 通过对本章的学习,即使从未接触过Vue.j ...
- WebGL three.js学习笔记 创建three.js代码的基本框架
WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...
- node.js系列笔记之fs模块《二》
一:感触 最近工作比较忙,感觉也比较多,因为工作上的不顺利,再加上加班比较多,所以最近心情不是很好,再加上英语能力差到不行,所以最近半个月学习进度也比较慢, 但还是告诉自己每天都坚持学一点,即使今天心 ...
- Node.js学习笔记(2) - Node.js安装及入门hello world
今天来简单的记录一下Node.js的安装配置以及简单的入门 一.Node.js的安装 1.windows下的安装 windows下的安装很简单,只需要去官网http://nodejs.org中,找到w ...
- Node.js学习笔记(1) - Node.js简介
近期在看一些Node.js的知识,看完后觉得,一些前面的东西忘记了,于是整理一下,方便自己查阅,也希望对学习Node.js的朋友有些帮助: 当然以下只是我个人的观点和理解,不喜勿喷,也望大神指教. 一 ...
- Node.js学习笔记(七) --- Node.js的静态文件托管、路 由、EJS 模板引擎、GET 、POST
1 . Nodejs 静态文件托管静态 web 服务器封装 2 . 路由 官方解释: 路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET.POST 等)组成的, ...
- Node.js学习笔记(八) --- Node.js的路由模块封装
1 .模块化的方式封装 整理中… 2 .封装仿照 express 的路由整理中…
- js系列(10)js的运用(二)
本节继续介绍在html页面中js的运用. (1)数码时钟:(http://files.cnblogs.com/files/MenAngel/text05.zip) <!DOCTYPE ...
- js系列(9)js的运用(一)
本节开始介绍javascript在html页面中的运用. (1)link样式表的动态绑定:(http://files.cnblogs.com/files/MenAngel/text04 ...
随机推荐
- SpringMVC4 + Spring + MyBatis3
SpringMVC4 + Spring + MyBatis3 本文使用最新版本(4.1.5)的springmvc+spring+mybatis,采用最间的配置方式来进行搭建. 1. web.xml 我 ...
- Web文件(图片)上传方法
在开放Web应用程序的时候经常会遇到图片或者是文件上传的模块,这里就是该模块的实现的后台方法 上传图片方法 /// <summary> /// 功能:上传图片方法 /// </sum ...
- MacOS10.9平台配置Appium+Java环境
1) 安装JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...
- 基于.NET MVC的高性能IOC插件化架构
基于.NET MVC的高性能IOC插件化架构 最近闲下来,整理了下最近写的代码,先写写架构,后面再分享几个我自己写的插件 最近经过反复对比,IOC框架选择了Autofac,原因很简单,性能出众,这篇博 ...
- PLSQL_监控有些SQL的执行次数和频率
原文:PLSQL_监控有些SQL的执行次数和频率 2014-12-25 Created By 鲍新建
- 直读Innodb datafile
这两天有空翻了翻大神写的<innodb存储引擎>,手痒亲身实践.由于此书出版了有段时日,没有用其推荐的python工具,通过点滴推敲,略微发现其中冰山一角的奥秘.对于今后对于一些问题查证或 ...
- 平安某金所奇葩的面经-关于幂等和ROA设计的反思
在公司一直在做跟支付有关的项目,某日接到平安某金所一男子电话,应该是之前某猎头投的,我正好在吃早饭(也不能怪他们上班早,我们公司弹性工作制,我一般上班比较晚). 因为饭馆信号不好,只能赶紧放下剩下的半 ...
- sql优化的50中方法
查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化 ...
- IT见解
IT见解 北京海淀区 2014-10-18 张俊浩 *域名的市值在走低,因其功能被新浪.腾讯微博.微信大V这种账号所代替 *小米将自己定位为互联网公司,而不是手机公司 *手机不远的未来会成为公共 ...
- 企业部署Windows 8 Store 风格应用
原文:企业部署Windows 8 Store 风格应用 引言 之前我们都知道可以将应用程序发布到Windows 商店中供用户下载使用.如果我们是企业开发人员,则我们的应用可能属于以下两种类别之一: 1 ...