用formidable處理上傳的文件 并更改文件名

用formidable處理上傳的文件 并更改文件名

image.png

在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');
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崇堵,一起剝皮案震驚了整個(gè)濱河市型诚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸳劳,老刑警劉巖狰贯,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡涵紊,警方通過查閱死者的電腦和手機(jī)傍妒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摸柄,“玉大人颤练,你說我怎么就攤上這事∏海” “怎么了嗦玖?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長跃脊。 經(jīng)常有香客問我宇挫,道長,這世上最難降的妖魔是什么酪术? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任器瘪,我火速辦了婚禮,結(jié)果婚禮上绘雁,老公的妹妹穿的比我還像新娘橡疼。我一直安慰自己,他們只是感情好庐舟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布欣除。 她就那樣靜靜地躺著,像睡著了一般继阻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上废酷,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天瘟檩,我揣著相機(jī)與錄音,去河邊找鬼澈蟆。 笑死墨辛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的趴俘。 我是一名探鬼主播睹簇,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寥闪!你這毒婦竟也來了太惠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤疲憋,失蹤者是張志新(化名)和其女友劉穎凿渊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埃脏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年搪锣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彩掐。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡构舟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堵幽,到底是詐尸還是另有隱情狗超,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布谐檀,位于F島的核電站抡谐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏桐猬。R本人自食惡果不足惜麦撵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溃肪。 院中可真熱鬧免胃,春花似錦、人聲如沸惫撰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厨钻。三九已至扼雏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夯膀,已是汗流浹背诗充。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诱建,地道東北人蝴蜓。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像俺猿,于是被迫代替她去往敵國和親茎匠。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理押袍,服務(wù)發(fā)現(xiàn)诵冒,斷路器,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評論 25 707
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案谊惭? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,728評論 1 92
  • 本文包括:1造烁、文件上傳概述2否过、利用 Commons-fileupload 組件實(shí)現(xiàn)文件上傳3、核心API——Dis...
    廖少少閱讀 12,517評論 5 91
  • 秋天又來了惭蟋。說真的苗桂,我只感覺秋天很美,不覺得很悲哀告组,或是像劉禹錫說的那樣煤伟。 現(xiàn)在,在腦海里想象: 一片金色的樹林里...
    滿天紅塵閱讀 498評論 1 2