Node.js(Express4.x)的Ajax處理2——文件上傳

0.目標(biāo)

AJAX即“Asynchronous Javascript And XML*”(異步JavaScript和XML)过蹂,是指一種創(chuàng)建交互式應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。
通過ajax方式上傳文件可以避免刷新網(wǎng)頁歪赢,本節(jié)將做一個(gè)簡單的Demo來說明如何操作。

【參考代碼】


1.部署Express

如果不知道如何部署单料,可參照: 部署Express

另外埋凯,可以參考如何通過提交表單刷新網(wǎng)頁的方式上傳文件:文件上傳


2.服務(wù)器端

這里要用到multer中間件,這個(gè)需要自行安裝:

npm install multer --save

在routes/index.js中引用multer扫尖,另外白对, 因?yàn)樾枰玫轿募到y(tǒng),所以還要引用fs模塊:

var multer  = require('multer');
var fs = require("fs");

增加一個(gè)路由换怖,用來顯示頁面:

/* 瀏覽器輸入地址(如127.0.0.1:3000/upload)后甩恼,顯示views/upload頁面,此頁面使用默認(rèn)引擎(這里是jade)渲染 */
router.get('/upload', function(req, res, next) {
  res.render('upload');
});

增加一個(gè)路由沉颂,用來處理上傳操作:

var upload = multer({ dest: '/tmp/' })
router.post('/file_upload', upload.array('image'), function(req, res, next) {

    console.log(req.files[0]);  // 上傳的文件信息
    
    if(undefined == req.files[0]){
        res.json(['failed', {msg:"沒有選擇要上傳的文件条摸!"}]);
        return -1;
    }

    var des_file = "./files/" + req.files[0].originalname;
    fs.readFile( req.files[0].path, function (err, data) {
        fs.writeFile(des_file, data, function (err) {
            if( err ){
                console.log( err );
                res.json(['failed', {msg:err}]);
            }else{
                response = {
                    msg:'File uploaded successfully', 
                    filename:req.files[0].originalname,
                };
                console.log( response );
                res.json(['success', response]);
            }
        });
    });
});

注意
在根目錄下創(chuàng)建一個(gè)文件夾,名稱是files铸屉。如果沒有先創(chuàng)建钉蒲,上傳文件時(shí)會報(bào)錯(cuò)。


3.客戶端頁面

3.1 添加js文件

在public/javascripts文件夾下彻坛,放入兩個(gè)文件:

  • jquery.min.js // 自行下載jquery
  • upload.js // 空白文件顷啼,下面會給出代碼

其中upload.js代碼如下:

var OL_Action_Root = "http://127.0.0.1:3000";
function Req_ajax()
{           
    var formData = new FormData($("#imagelist")[0]);
    $.ajax({
        url: OL_Action_Root+'/file_upload',
        type: 'POST',
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        success: function(data){
            var res = data;
            if(res[0] == 'success')
            {
                document.getElementById("status").innerHTML = "<span style='color:green'>文件上傳成功帆赢!<br>文件名為:"+res[1].filename+"</span>";
            }
            else
            {
                document.getElementById("status").innerHTML = "<span style='color:#EF0000'>文件上傳失敗线梗!<br>原因是:"+res[1].msg+"</span>";
            }
        },
        error: function(jqXHR, textStatus, errorThrown){
            document.getElementById("status").innerHTML = "<span style='color:#EF0000'>連接不到服務(wù)器椰于,請檢查網(wǎng)絡(luò)!</span>";
        }
    });
}

3.2 添加頁面

在views文件夾下仪搔,添加一個(gè)文件upload.jade

doctype html
html
    head
        title= title
        link(rel='stylesheet', href='/stylesheets/style.css')
    body
        h1 Express通過Ajax文件上傳
        h3 選擇一個(gè)文件上傳
            form(enctype="multipart/form-data" method="post" )#imagelist
                input(type="file" name="image")
                input(type="button" value="上傳文件" onclick="Req_ajax()")
        
        p#status
        p#preview
        
    script(src='/javascripts/jquery.min.js')
    script(src='/javascripts/upload.js')

4.測試

運(yùn)行服務(wù)瘾婿,在瀏覽器里輸入:

http://127.0.0.1:3000/upload

瀏覽器中選擇一個(gè)文件上傳:


選擇上傳文件

上傳結(jié)果:


上傳結(jié)果
文件

服務(wù)端打印:


服務(wù)端打印

原創(chuàng)文章烤咧,未經(jīng)許可偏陪,請勿轉(zhuǎn)載
作者:Mike的讀書季
日期:2016.09.19
QQ:1139904786
Blog:http://blog.csdn.net/kkdestiny

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市煮嫌,隨后出現(xiàn)的幾起案子笛谦,更是在濱河造成了極大的恐慌,老刑警劉巖昌阿,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饥脑,死亡現(xiàn)場離奇詭異,居然都是意外死亡懦冰,警方通過查閱死者的電腦和手機(jī)灶轰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刷钢,“玉大人笋颤,你說我怎么就攤上這事∧诘兀” “怎么了伴澄?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長阱缓。 經(jīng)常有香客問我非凌,道長,這世上最難降的妖魔是什么茬祷? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任清焕,我火速辦了婚禮,結(jié)果婚禮上祭犯,老公的妹妹穿的比我還像新娘秸妥。我一直安慰自己,他們只是感情好沃粗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布粥惧。 她就那樣靜靜地躺著,像睡著了一般最盅。 火紅的嫁衣襯著肌膚如雪突雪。 梳的紋絲不亂的頭發(fā)上起惕,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音咏删,去河邊找鬼惹想。 笑死,一個(gè)胖子當(dāng)著我的面吹牛督函,可吹牛的內(nèi)容都是我干的嘀粱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辰狡,長吁一口氣:“原來是場噩夢啊……” “哼锋叨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宛篇,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤娃磺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后叫倍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偷卧,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年段标,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涯冠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逼庞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞻赶,到底是詐尸還是另有隱情赛糟,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布砸逊,位于F島的核電站璧南,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏师逸。R本人自食惡果不足惜司倚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篓像。 院中可真熱鬧动知,春花似錦、人聲如沸员辩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奠滑。三九已至丹皱,卻和暖如春妒穴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摊崭。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工讼油, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呢簸。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓矮台,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阔墩。 傳聞我的和親對象是個(gè)殘疾皇子嘿架,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

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