NodeJs【自學筆記】2

NodeJs 自學筆記2

實現 表單提交 和 文件上傳

表單提交:

  • 獲取輸入數據

文件上傳:

  • 多文件上傳
  • 驗證上傳文件格式
  • 驗證上傳文件大小

目錄結構:

![結構](https://img-blog.csdn.net/20160304164304845)

www.js

//獲取server.js 服務器文件  
var server = require("../Server");

//獲取router.js 入口文件  
var router = require("../routes/Router");

//獲取requestHandlers.js 請求處理文件  
var requestHandlers = require("../request/requestHandlers");

//配置handle請求  
var handle = {};

//配置 用戶輸入 / 的請求方法  
handle["/"] = requestHandlers.start;

//配置 用戶輸入 /start 的請求方法  
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;
handle["/file_img"] = requestHandlers.file_img;
handle["/upload_file"] = requestHandlers.upload_file;
handle["/show"] = requestHandlers.show;



//執行 server start方法,把 router and handle作爲參數一起帶入。
server.start(router.route, handle);  

Server.js

//獲取http服務器  
var http = require("http");


//服務器創建方法  
function start(route, handle) {

    //服務器請求,響應方法
    function onRequest(request, response) {
            //入口方法
            route(handle, request, response);
    }

    //獲取創建的服務器
    var newServer = http.createServer(onRequest);
    //設置端口
    newServer.listen(8888);
    console.log("------------------------------------Run------------------------------------");
}

//創建本js的模塊start方法 爲 start方法  
exports.start = start;  

Router.js

//獲取url
var url = require("url");

//入口方法
function route(handle, request, response, postData) {

    //獲取url路徑 --->端口後面的路徑
    var pathname = url.parse(request.url).pathname;

    //判斷請求的路徑是否有相對應的解決處理方法
    if (typeof handle[pathname] === 'function') {

        //有則執行
        handle[pathname](request,response);

    } else {
        console.log("Error");
        //沒有則返回404
        response.writeHead(404, {"Content-Type": "text/plain"});
        response.write("404 Not found");
        response.end();
    }
}

//創建本js的模塊route方法 爲 route方法
exports.route = route;

requestHandlers.js


//獲取 querystring 模塊
//可以用querystring模塊來解析POST請求體中的參數
var querystring = require("querystring");
var formidable = require("formidable");
var fs = require("fs");
var lib = require("../routes/lib");

//請求處理方法 start
function start(request, response) {
    console.log("Request handler 'start' was called.");

    //設置 代碼
    var body =
        '<form action="/upload" method="post">' +
        '<textarea name="name1" rows="10" cols="100"></textarea>' +
        '<textarea name="name2" rows="10" cols="100"></textarea>' +
        '<textarea name="name3" rows="10" cols="100"></textarea>' +
        '<textarea name="name4" rows="10" cols="100"></textarea>' +
        '<input type="submit" value="Submit text" />' +
        '</form>';

    response.writeHead(200, {"Content-Type": "text/html"});
    //輸出
    response.write(lib.newBody(body));
    response.end();
}


//請求處理方法 upload
function upload(request, response) {

    //命名上傳的數據
    var data = "";
    //監聽數據提交事件
    request.addListener("data", function (postDataChunk) {
        //獲取postDataChunk 提交的數據
        data += postDataChunk;
        console.log("------------->         " + postDataChunk);
    });

    response.writeHead(200, {"Content-Type": "text/html"});

    //數據提交完成事件
    request.addListener("end", function () {

        //querystring 模塊的parse 方法,把所有數據封裝成一個 object
        var dataAll = querystring.parse(data);

        //遍歷
        for (var i in dataAll) {
            console.log(i + "|" + dataAll[i]);
            data = data + i + "|" + dataAll[i] + "<br>";
        }

        //顯示
        response.end(lib.newBody(data));//響應結束
    });

}


function file_img(request, response) {

    response.writeHead(200, {"Content-Type": "text/html"});
    response.end(lib.newBody(
        '<form action="/upload_file" enctype="multipart/form-data" ' +
        'method="post">' +
        '<input type="text" name="title1" placeholder="t1"><br>' +
        '<input type="text" name="title2" placeholder="t2"><br>' +
        '<input type="text" name="title3" placeholder="t3"><br>' +
        '<input type="text" name="title4" placeholder="t4"><br>' +
        '<input type="text" name="title5" placeholder="t5"><br>' +
        '<input type="file" name="upload1" multiple="multiple"><br>' +
        '<input type="file" name="upload2" multiple="multiple"><br>' +
        '<input type="file" name="upload3" multiple="multiple"><br>' +
        '<input type="file" name="upload4" multiple="multiple"><br>' +
        '<input type="file" name="upload5" multiple="multiple"><br>' +
        '<input type="submit" value="Upload">' +
        '</form>'));
}

function upload_file(request, response) {
    //formidable模塊提供的IncomingForm函數
    var form = new formidable.IncomingForm();
    //設置文件臨時文件路徑
    form.uploadDir = "upload"; // project dir

    //保存運行方法
    form.parse(request, function (error, fields, files) {
        if (error) throw error;

        //遍歷 非文件數據
        for (var i in fields) {
            console.log(fields[i]);
        }

        //遍歷 文件數據
        for (var i in files) {
            //獲取文件類型
            var suffix = lib.getImage(files[i].type);
            var size = lib.getSize(files[i].size);
            size ? console.log("超過2M") : console.log("沒有超過");
            //判斷是否爲 image類型 以及是否超過設置大小
            if (suffix == false || size) {
                //刪掉臨時文件
                fs.unlink("./" + files[i].path);
            } else {
                //是的則把文件保存到newUpload文件夾下
                fs.rename("./" + files[i].path, "./newUpload/" + lib.getRandomName(files[i].type) + suffix, function (e) {
                    if (e)
                        throw e;
                });
            }
        }

        //跳轉到 /show 路徑
        lib.jumpEnd(response, "/show");

    });
}


//顯示一張圖片
function show(request, response) {
    fs.readFile("./upload/1457076106649-27.gif", "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();
        }
    });
}


//創建本js的模塊start方法 爲 start方法
exports.start = start;
//創建本js的模塊upload方法 爲 upload方法
exports.upload = upload;

exports.upload_file = upload_file;

exports.file_img = file_img;

exports.show = show;

lib.js


//獲取一個隨機名字
function getRandomName() {

    var dateNmae = new Date().getTime();
    var numOutput = new Number(Math.random() * 100).toFixed(0);
    dateNmae = dateNmae + "-" + numOutput;
    return dateNmae;
}

//獲取圖片後綴,如果非圖片則返回 false
function getImage(type) {
    var i = type.indexOf("image/");
    var ret = i < 0 ? false : type.replace("image/", ".");
    return ret;
}

//html方式跳轉
function jumpEnd(response, url) {
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write('<script>window.location.href="' + url + '";</script>');
    response.end();
}

//返回一個 測試body
function newBody(body) {
    return '<html>' +
        '<head>' +
        '<meta http-equiv="Content-Type" content="text/html; ' +
        'charset=UTF-8" />' +
        '</head>' +
        '<body>' +
        body +
        '</body>' +
        '</html>';
}

//大小不能超過 2M
var sizeMax = 2;
function getSize(size) {
    sizeMax = sizeMax * 1024 * 1024;
    return size > sizeMax;
}


exports.getRandomName = getRandomName;
exports.getImage = getImage;
exports.jumpEnd = jumpEnd;
exports.newBody = newBody;
exports.getSize = getSize;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章