node-上传图片练习

keywords:formidable模块 multipart/form-data格式(content-type类型)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
//index.js
//根文件,服务器启动,准备解析相应url
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);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
//server.js
//监听8888端口,路由跳转
var http = require('http');
var url = require('url');

function start(route, handle) {
function onRequest(req, res) {
if (req.url === "/favicon.ico") return;
//屏蔽浏览器favicon,这玩意就是标签页顶显示的那个小图标,否则刷新页面会出现两次路径
<!--关于favicon图标,要么直接扔到根目录,要么head里设置如下
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /> //这里保证IE兼容性
//<link rel="icon" href="/favicon.ico" sizes="32x32" />
//网站图标缓存,尽量不要超过16kb吧。32*32一般也就4kb-->
console.log('received');
var pathname = url.parse(req.url).pathname; //解析req.url
route(handle,pathname,req,res);
}
http.createServer(onRequest).listen(8888);
console.log('start');
}
exports.start = start;
/*var postData = ""; 这部分是读取文件测试
req.setEncoding("utf8");
req.addListener("data", function(chunk) {
postData += chunk;
console.log(chunk);
});
req.addListener("end", function() {
route(pathname, handle, res, postData);
})*/
1
2
3
4
5
6
7
8
9
10
11
12
13
 
//router.js
//路径无效404处理,有效开始分配事件处理程序
function route(handle,pathname,req,res) {
if (typeof handle[pathname] === 'function') {
handle[pathname](res.req);//注意req在前?总是提示“res.writeHead not a function”的坑,只能各个文件轮流更改参数顺序了
} else {
res.writeHead(404, { "Content-Type": "text/html" });
res.write("404");
res.end();
}
}
exports.route = route;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
//requestHandlers.js
//事件处理程序,针对不同路由
var exec = require('child_process').exec; //注意没()
var querystring = require('querystring'),fs = require("fs"),
formidable = require('formidable');

function start(res) {
/*function sleep(sec) {
let now = new Date().getTime();
while (new Date().getTime() < now + sec);
/*let now = new Date(),exitTime = startTime.getTime()+sec;
while (true) {
now = new Date();
if (now.getTime() > exitTime)
return;
}
}
sleep(10000);*/
/*var content = "empty";
exec("ca.txt", function(error, stdout, stderr) {*/
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""/>' + //判断是否提交, onchange="alert(this.value)或者判断value是否为空?实际就是表单验证
'</form>' +
'</body>' +
'</html>';
res.writeHead(200, { "Content-Type": "text/html;charset=utf-8" });
res.write(body); //写入相应路径的返回值
res.end(); //直接打开相应文件了

}
function upload(res, req) {
var form = new formidable.IncomingForm();
form.parse(req,function(err,fields,files){
fs.renameSync(files.upload.path,"./tmp/2.jpg");//重命名为右侧
res.writeHead(200, { "Content-Type": "text/html;charset=utf-8" });
res.write("<img src='/show'>");
res.end();
})

}

function show(res){
fs.readFile("./tmp/2.jpg","binary",function(err,file){
if(err){
res.writeHead(500, { "Content-Type": "text/plain;charset=utf-8" });
res.write(err+"\n");
res.end();
}else{
res.writeHead(200, { "Content-Type": "image/jpg" });
res.write(file,"binary");
res.end();
}
})
}
exports.start = start;
exports.upload = upload;
exports.show = show;