【nodejs】文件上传demo实现
文件结构:
index.js
var server = require('./server.js'); var router = require('./router.js'); 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);
server.js
var http = require("http"); var url = require("url"); function start(route,handle){ function onRequest(request,response){ var postData = ""; var pathname = url.parse(request.url).pathname; // request.setEncoding("utf8"); // request.addListener("data", function(postDataChunk) { // postData += postDataChunk; // console.log("Received POST data chunk '"+ // postDataChunk + "'."); // }); // request.addListener("end", function() { // route(pathname,handle, response, postData); // }); route(pathname,handle, response, request); } http.createServer(onRequest).listen(8888); } exports.start=start;
router.js
function route(pathname,handle,response,request) { var handler = handle[pathname]; console.log(handler); if(typeof handler == "function"){ handler(response,request); }else{ console.log("No request handler found for " + pathname); response.writeHead(404, {"Content-Type": "text/plain"}); response.write("404 Not found"); response.end(); } } exports.route=route;
requestHandlers.js
var querystring = require("querystring"), fs = require("fs"), formidable = require("formidable"); function start(response,request) { 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">'+ '<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."); // response.writeHead(200, {"Content-Type": "text/plain"}); // response.write("You've sent: " + postData); // response.end(); var form = new formidable.IncomingForm(); form.uploadDir='tmp'; console.log("about to parse"); form.parse(request, function(error, fields, files) { console.log("parsing done"); fs.renameSync(files.upload.path, "./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, request) { console.log("Request handler 'show' was called."); fs.readFile("./tmp/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;
本文中代码参考自http://www.nodebeginner.org/index-zh-cn.html#javascript-and-nodejs