一个文件上传示例

//一个文件上传示例:

(1),建立“server.js”

//复制代码 代码如下:
var http = require('http');
var url = require('url');

function start(route, handler) {
    //http服务回调
    //request 请求对象
    //response 响应对象
    //handler 传入的对象,这个对象包含 很多函数对象
    function onRequest (request, response) {
        //得到请求对象的 url 路径
        var pathname = url.parse(request.url).pathname;
        // 路由到相应的业务逻辑
        route (pathname, handler, response, request);
    }

    //创建http服务器
    http.createServer(onRequest).listen(3000);
    console.log('server is starting');
}
exports.start = start

(2),建立“route.js”

//复制代码 代码如下:
    function route (pathname, handler, response, request) {
        console.log('about to route a request for ' + pathname);
        if (typeof handler[pathname] === 'function') {
            return handler[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;

(3),建立“requestHandler.js”

//复制代码 代码如下:
    var querystring = require('querystring'),
        fs = require('fs'),
        formidable = require('formidable');

function start (response, request) {
    console.log('start module');
    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="Submit text" />'+
        '</form>'+
        '</body>'+
        '</html>';
    // 200代表状态成功, 文档类型是给浏览器识别用的
    response.writeHead(200, {'Content-Type': 'text/html'});
    //响应对象写入 body  (也就是html代码)
    response.write(body);
    response.end();//写入完毕
}
function upload (response, request) {
    console.log('upload module');
    var form = new formidable.IncomingForm();
    //第二个参数也是一个回调函数, 通过事件触发调用
    form.parse(request, function (error, fields, files) {
        //files.upload.path 正在写入此文件的  路径。
        //Error: EXDEV, cross-device link not permitted
        // 'C:\Users\LI~1\AppData\Local\Temp\upload_58c5fbc8c804174256ce2826d766bb0a'
        //fs.renameSync(files.upload.path, '/tmp/test.png');


        //-------this is old code begin----------------------------------
        //util.pump is deprecated.  使用is.pipe(os),然后监听输出流上的“end”事件。
        //  var utills = require('util');
        //
        // //把fs.renameSync();,替换成下面的就可以了。
        // var readStream = fs.createReadStream(files.upload.path);
        // var writeSream = fs.createWriteStream("/tmp/test.png");
        // utills.pump(readStream,writeSream,function(){
        //     fs.unlinkSync(files.upload.path);
        // });
        //-------this is old code begin----------------------------------

        //-----------------------------------------
        //在Node.js 我如何移动文件a(files.upload.path)到不同的分区或设备?
        var fs = require('fs');
//var util = require('util');

        var is = fs.createReadStream(files.upload.path);
        var os = fs.createWriteStream("/tmp/test.png");

        //在跨不同分区移动文件时,需要复制和取消链接。
        is.pipe(os);
        is.on('end',function() {
            fs.unlinkSync(files.upload.path);
        });

/* node.js 0.6 and earlier you can use util.pump:
util.pump(is, os, function() {
    fs.unlinkSync('source_file');
});
*/
    //-----------------------------------------

        //fs.renameSync('I:\\\\tmp1\\\\886.png', '/tmp/test.png');

        response.writeHead(200, {'Content-Type': 'text/html'});
        response.write('You\'ve sent: <br />');
        response.write('<img src="/show" />');
        response.end();
    });
}
function show (response, request) {
    console.log('show module');
    fs.readFile ('/tmp/test.png', 'binary', function (error, file) {
        if (error) {
            response.writeHead(200, {'Content-Type': 'text/html'});
            response.write(error);
            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;

(4),建立“index.js”

//一个文件上传示例:

//复制代码 代码如下:
var server = require('./server');
var router = require('./route');
var requestHandler = require('./requestHandler');
var formidable = require('formidable'); // require路径搜索算法??
var handler = {};
handler['/'] = requestHandler.start;
handler['/start'] = requestHandler.start;
handler['/upload'] = requestHandler.upload;
handler['/show'] = requestHandler.show;
server.start(router.route, handler);

// 四,总结一下
//
//   (1),理解 "Fs与Stream之间的联系" 。
// (2),熟练使用 "FS" 相关的api。
// (3),注意细节的把控,比如: 文件操作api同步方式与异步方式之间的处理细节。
// (4),最后强调:理解文件上传例子中的代码组织方式,不断重构,不断总结。


猜你喜欢

转载自blog.csdn.net/baidu_19552787/article/details/87810469