Node.js零起点开发(七)-上传图片并且显示图片
2012-10-22 14:11
399 查看
本节介绍做个例子,实现上传图片,并且显示图片,中间修改了原作者demo中的bug。
之前教程中的例子都可以脱离nodejs的目录依赖,即放在任何位置都可以执行,本节的例子和编译环境都必须放在nodejs的目录下,因为牵涉到路径的问题。
使用该模块,首先需要安装该模块。Node.js有它自己的包管理器,叫NPM。它可以让安装Node.js的外部模块变得非常方便。通过如下一条命令就可以完成该模块的安装:
![](http://img.my.csdn.net/uploads/201210/22/1350885302_7749.JPG)
1.先进入到nodejs的安装路径
cd C:\Program Files (x86)\nodejs
2.下载模块
npm install formidable
注:安装外部模块需要进入nodejs的根目录来执行npm指令
var formidable = require("formidable");
这里该模块做的就是将通过HTTP POST请求提交的表单,在Node.js中可以被解析。我们要做的就是创建一个新的IncomingForm,它是对提交表单的抽象表示,之后,就可以用它解析request对象,获取表单中需要的数据字段。
注:想要能引用到formidable,必须把你的项目放在nodejs的安装目录下,否则会出现下面的错误
![](http://img.my.csdn.net/uploads/201210/22/1350885855_3542.JPG)
requestHandlers.js
router.js
server.js
index.js
硬盘中的文件
![](http://img.my.csdn.net/uploads/201210/22/1350886389_8405.JPG)
nodejs执行的结果
![](http://img.my.csdn.net/uploads/201210/22/1350886474_3130.JPG)
浏览器中显示的结果
之前教程中的例子都可以脱离nodejs的目录依赖,即放在任何位置都可以执行,本节的例子和编译环境都必须放在nodejs的目录下,因为牵涉到路径的问题。
安装外部模块
首先我们要安装一个外部模块,该模块是Felix Geisend?rfer开发的node-formidable模块。它对解析上传的文件数据做了很好的抽象。 其实说白了,处理文件上传“就是”处理POST数据 —— 但是,麻烦的是在具体的处理细节,所以,这里采用现成的方案更合适点。使用该模块,首先需要安装该模块。Node.js有它自己的包管理器,叫NPM。它可以让安装Node.js的外部模块变得非常方便。通过如下一条命令就可以完成该模块的安装:
1.先进入到nodejs的安装路径
cd C:\Program Files (x86)\nodejs
2.下载模块
npm install formidable
注:安装外部模块需要进入nodejs的根目录来执行npm指令
引用外部模块
现在我们就可以用formidable模块了——使用外部模块与内部模块类似,用require语句将其引入即可:var formidable = require("formidable");
这里该模块做的就是将通过HTTP POST请求提交的表单,在Node.js中可以被解析。我们要做的就是创建一个新的IncomingForm,它是对提交表单的抽象表示,之后,就可以用它解析request对象,获取表单中需要的数据字段。
注:想要能引用到formidable,必须把你的项目放在nodejs的安装目录下,否则会出现下面的错误
requestHandlers的模块
应用程序需要新的部件,因此加入新的模块 -- 已经无需为此感到新奇了。我们来创建一个叫做requestHandlers的模块,并对于每一个请求处理程序,添加一个占位用函数,随后将这些函数作为模块的方法导出:requestHandlers.js
var querystring = require("querystring"), fs = require("fs"), formidable = require("formidable"); function start(response) { console.log("Request handler 'start' was called."); var body = '<html>'+ '<head>'+ '<meta http-equiv="Content-Type" content="text/html; '+ 'charset=UTF-8" />'+ '</head>'+ '<body>'+ '<form action="/upload" enctype="multipart/form-data" '+ 'method="post">'+ '<input type="file" name="upload" multiple="multiple">'+ '<input type="submit" value="Upload file" />'+ '</form>'+ '</body>'+ '</html>'; response.writeHead(200, {"Content-Type": "text/html"}); response.write(body); response.end(); } function upload(response, request) { console.log("Request handler 'upload' was called."); var form = new formidable.IncomingForm(); console.log("about to parse"); form.parse(request, function(error, fields, files) { console.log("parsing done"); console.log(files.upload.path); //fs.renameSync(files.upload.path, "/tmp/test.png"); 这个会报错,这个应该是linux的路径 fs.renameSync(files.upload.path, "./upload/test.png"); //winodw认的路径,nodejs的安装路径 //fs.renameSync(files.upload.path, "d:/tmp/test.png"); 这个也报错 response.writeHead(200, {"Content-Type": "text/html"}); response.write("received image:<br/>"); response.write("<img src='/show' />"); response.end(); }); } function show(response) { console.log("Request handler 'show' was called."); //winodw认的路径,nodejs的安装路径 fs.readFile("./upload/test.png", "binary", function(error, file) { if(error) { response.writeHead(500, {"Content-Type": "text/plain"}); response.write(error + "\n"); response.end(); } else { response.writeHead(200, {"Content-Type": "image/png"}); response.write(file, "binary"); response.end(); } }); } exports.start = start; exports.upload = upload; exports.show = show;
router模块
通过检查给定的路径对应的请求处理程序是否存在,如果存在的话直接调用相应的函数router.js
function route(handle, pathname, response, request) { console.log("About to route a request for " + pathname); if (typeof handle[pathname] === 'function') { handle[pathname](response, request); } else { console.log("No request handler found for " + pathname); response.writeHead(404, {"Content-Type": "text/html"}); response.write("404 Not found"); response.end(); } } exports.route = route;
server模块
处理请求模块server.js
var http = require("http"); var url = require("url"); function start(route, handle) { function onRequest(request, response) { var pathname = url.parse(request.url).pathname; console.log("Request for " + pathname + " received."); route(handle, pathname, response, request); } http.createServer(onRequest).listen(8888); console.log("Server has started."); } exports.start = start;
index模块
启动模块,主模块index.js
var server = require("./server"); var router = require("./router"); var requestHandlers = require("./requestHandlers"); var handle = {} //区分大小写的 handle["/"] = requestHandlers.start; handle["/start"] = requestHandlers.start; handle["/upload"] = requestHandlers.upload; handle["/show"] = requestHandlers.show; server.start(router.route, handle);
运行后效果
如果现在启动应用(node index.js,始终记得这个命令行),随后请求一个URL,我请求的分别是是http://localhost:8888/,上传文件提交后,页面就会显示该图片了,并且硬盘也会存在该文件。硬盘中的文件
nodejs执行的结果
浏览器中显示的结果
相关文章推荐
- VS 2005中winForm开发(C#)—图片上传到数据库与显示(sql server 2005)
- VS 2010中WinForm开发(C#)—图片上传到数据库与显示(sql server 2008)
- nodejs之上传图片并且显示图片
- 用asp.net 多文件上传 (并且图片即使显示)并隐藏上一个文件选择器
- javaweb上传图片,并且从数据库中查出,在页面显示,同时保存图片到数据库中
- tomcat容器 SSH项目开发 上传图片图片名为中文时不能显示图片问题解决
- SpringMVC+Ajax用FormData对象上传页面的图片(文件),并且立马在页面上显示出来
- 选择多张图片上传显示,并且删除。
- struts2图片上传并且显示(注意乱码)
- 【微信开发学习笔记(二)】:上传图片后显示不了
- 我在开发上传图片文件预览的时候IE无法正常显示,火狐可以正常显示
- struts中用kindeditor实现的图片上传并且显示在页面上
- 将一张图片上传并且在某个div进行显示
- android app开发中将表情图片上传到服务器并获取显示
- JSP页面使用文件上传图片并且回传显示的注意事项
- 上传图片到服务器,服务器保存并且接收到了,但是必须刷新文件夹或者重新部署文件才能在客户端显示图片
- android开发----异步下载图片,并且进行缓存和显示图片
- 上传图片并且显示所略图
- Android开发中调用系统相册上传图片到服务器OPPO等部分手机上出现短暂的显示桌面问题的解决方法
- 上传图片,显示,并且把图片信息存储到数据库表中9.17