使用Node 搭建简单Web服务器(二)之文件上传

安装Node后,打开node所在的文件夹,有一个node_modules文件夹,打开node_modules文件夹,可看到有一个npm文件夹和formidable这个文件夹。如果没有,说明没安装 node-formidable模块。(node-formidable模块是外部模块是Felix Geisendörfer开发的)

安装node-formidable模块:

             cmd输入->> npm install formidable

安装成功:

               npm info build Success: formidable@1.0.9
               npm ok


1.Server.js
技术分享
// 最终服务端————简单的服务器

var http = require("http"); //在node中,可以使用require()函数来加载模块. 
var url = require("url");//加载url模块
function start(route, handler) {
    function OnRequest(request, response) {
        var pathname = url.parse(request.url).pathname; //获得url地址
            //handler,执行的方法
            route(pathname, handler, response,request); //这里把request也传入route...
    }
    http.createServer(OnRequest).listen(8888);
    console.log("Server has Started...");
}
exports.start = start; //start是一个方法,调用
View Code

 

2.route.js

技术分享
function route(pathname, handler, response,request) {
    //匹配用户的输入的url,是不是一个方法 function,是方法就把方法返回,不是就报错 Not Found 404
    if (typeof handler[pathname] == "function") {
        return handler[pathname](response, request);
    } else {
        response.writeHead(200, { "Content-Type": "text/plain" });
        response.write("Not Found 404...");
        response.end();
    }
}
exports.route = route;
View Code

 

3.index.js

技术分享
var server = require("./server"); //    ./server  获得node.exe 同级别目录下的server.js文件
var router = require("./route"); //获得 route.js文件
var requestHandlers = require("./handler"); //获得 handler.js文件
var handle = {};

//制定路由规则,在url中输入  /start 则返回  handler.js  中的 start 方法!!!
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;
handle["/show"] = requestHandlers.show;  //添加要显示的show方法

server.start(router.route,handle);  //主入口......
View Code

 

4.handler.js

技术分享
/*
在 route中被调用的方法  ( Node.js不会对数据做缓存 )
*/

/*
查询数据库,又或者是进行大量的计算会包含阻塞操作。形象的说就是“它阻塞了所有其他的处理工作”。
引入了一个新的Node.js模块,child_process。之所以用它,是为了实现一个既简单又实用的非阻塞操作:exec()。
*/
var exec = require("child_process").exec;
var querystrnig = require("querystring");//querystring模块,处理POST数据
var fs = require("fs");//fs模块中,nodejs提供了异步和同步两种读写方式
var formidable = require("formidable");// node - 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>‘;       //这里是一个HTML 页面的Form表单

    exec("ls -lah", function (error, stdout, stderr) {
        response.writeHead(200, { "Content-Type": "text/html" });
        //body = stdout;
        response.write(body);
        response.end();
    });
}

function upload(response, request) {
    console.log("Request handler ‘upload‘ was called.");
    var form = new formidable.IncomingForm();// 使用 node - formidable模块中的方法
    form.uploadDir = "temp"; //指明路径
   
    form.parse(request, function (error, fields, files) {
        console.log("path:" + files.upload.path);
        try
        {
            //files.upload.path 文件  
            //"temp/test.png" 把用户发送过来的图片保存到temp目录下。test.png是图片的文件名
            fs.renameSync(files.upload.path, "temp/test.png");
        }catch(e){
            console.log(e);
        }
           response.writeHead(500, { "Content-Type": "text/html" });
           response.write("Received Image:<br/>");
           response.write("<img src=‘/show‘ />");//src指向的url地址为:show
           response.end();
    })
}

//执行用户上传的图片文件。把图片展示出来
function show(response) {
    console.log("Show was called....");
    fs.readFile("temp/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");//binary 二进制
            response.end();
        }
    });
}

exports.start = start;
exports.upload = upload;
exports.show = show;
View Code

 

cmd->node index.js

//url 输入:http://localhost:8888/start

技术分享

 

-->Upload File 提交  (能看到图片啦....)

技术分享





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。