用formidable處理上傳的文件 并更改文件名
在Web開發(fā)中,文件上傳也是一個(gè)非常常見蛀序、非常重要的功能欢瞪。想象一下,你正要?jiǎng)?chuàng)建一個(gè)可以上傳相冊的程序徐裸,還要通過Web鏈接跟其他人分享你的照片遣鼓。借助帶文件上傳控件的表單,用瀏覽器可以實(shí)現(xiàn)這個(gè)功能重贺。formidable的流式解析器讓它成為了處理文件上傳的絕佳選擇骑祟,也就是說它能隨著數(shù)據(jù)塊的上傳接收它們,解析它們气笙,并吐出特定的部分次企,就像我們之前提到的部分請求頭和請求主體。這種方式不僅快潜圃,還不會因?yàn)樾枰罅烤彌_而導(dǎo)致內(nèi)存膨脹缸棵,即便像視頻這種大型文件,也不會把進(jìn)程壓垮谭期。
let http = require('http');
let formidable = require('formidable');
let util = require("util");
let fs = require("fs");
let sd = require("silly-datetime");
let path = require("path");
let server=http.createServer((req,res)=>{
console.log(req.method);
switch (req.method){
case 'GET':
show(req,res);
break;
case 'POST':
upload(req, res);
break;
}
})
server.listen(32001)
function show(req,res) {
//提供帶有文件上傳控件的HTML表單
let html=`
<html>
<body>
<form method="post" action="/" enctype="multipart/form-data">
<p><input type="text" name="name"></p>
<p><input type="file" name="file"></p>
<p><input type="submit" value="Upload"></p>
</form>
</body>
</html>
`
res.setHeader('Content-type', 'text/html');
res.setHeader('Content-Length', Buffer.byteLength(html));
res.end(html);
}
function upload(req,res) {
if (!isFormData(req)){
//在請求中的內(nèi)容類型不對時(shí)返回400 Bad Request響應(yīng)
res.statusCode = 400;
res.end('Bad Request');
return;
}
let form = new formidable.IncomingForm();
form.uploadDir = "./uploads";
form.on('field',(field,value)=>{
console.log(field);
console.log(value);
});
form.on('file',(name,file)=>{
console.log(name);
console.log(file);
});
form.on('end',()=>{
res.end('upload complete');
})
form.parse(req,(err,fields,files)=>{
//重命名
let ttt = sd.format(new Date(), 'YYYYMMDDHHmmss');
let ran = parseInt(Math.random() * 89999 + 10000);
let extname = path.extname(files.file.name);
let oldpath=__dirname+'/'+files.file.path
let newpath = __dirname + '/uploads/' + ttt + ran + extname;
fs.rename(oldpath, newpath,function(err){
if(err){
throw Error("改名失敗");
}
});
});
}
//輔助函數(shù)isFormData()用String.indexOf()方法檢查請求頭中的Content-Type字段蛉谜,斷言它的值是以multipart/form-data開頭的。
function isFormData(req) {
let type = req.headers['content-type'] || '';
return 0 === type.indexOf('multipart/form-data');
}