Node.js+Express+MongoDB 建站實(shí)例——上傳圖片及其他模塊

本項(xiàng)目為系列博客被环,目前有以下系列

本文源碼請(qǐng)看 https://github.com/jiaoyanlin/myNodeProject/tree/c5237306394c4896aee804a3d378dd2a92be24e0

其他模塊

由于上兩篇文章中已經(jīng)將如何往數(shù)據(jù)庫中插入糙及、修改數(shù)據(jù)等做了演示,因此這篇文章就不再重復(fù)了蛤售,主要記錄一些開發(fā)時(shí)遇到的問題及解決方案(具體實(shí)現(xiàn)方法看源碼)丁鹉。

1妒潭、 這邊推薦使用postman進(jìn)行接口測(cè)試悴能,postman網(wǎng)上有很多教程可以看,主要提一下雳灾,在使用postman提交post請(qǐng)求時(shí)漠酿,注意body中選擇x-www-form-urlencoded模式來發(fā)送,否則后臺(tái)這邊無法通過req.body.xxx來獲取參數(shù)谎亩。

2炒嘲、 使用mongodb查詢數(shù)據(jù)庫時(shí)我們有時(shí)會(huì)使用_id作為參數(shù)進(jìn)行查詢,但是直接將它作為條件是查詢不到的匈庭,應(yīng)該按照下方這樣來查詢:

var ObjectId = require('mongodb').ObjectId;
...
// 更新個(gè)人信息
exports.updateUserinfo = function (req, res, next) {
    let newData = {
        "name": req.body.name,
        "phone": req.body.phone,
        "motto": req.body.motto
    };
    if (!testTel(req.body.phone)) {
        return res.json({
            "code": 401,
            "message": "手機(jī)號(hào)碼格式不正確"
        })
    }
    // 注意這里用ObjectId(req.cookies.id)
    db.updateMany('users', { "_id": ObjectId(req.cookies.id) }, newData, function (err, result) {
        if (err) {
            return res.json({
                "code": 401,
                "message": "更新失敗"
            })
        }

        return res.json({
            "code": 200,
            "message": "更新成功"
        })
    })
}

圖片上傳模塊

1夫凸、安裝依賴
npm install formidable silly-datetime --save

2、前端使用ajax的formdata進(jìn)行上傳圖片(為了測(cè)試也可直接用postman上傳阱持,注意body中選擇form-data)

<div>圖片上傳:<input type="file" name="fileToUpload" id="fileToUpload" class="fileupload" /></div>
<img style="width: 100px;" />
// 圖片上傳
$('.fileupload').change(function(event) {
    if ($('.fileupload').val().length) {
        var fileName = $('.fileupload').val();
        var extension = fileName.substring(fileName.lastIndexOf('.'), fileName.length).toLowerCase();
        if (extension == ".jpg" || extension == ".png") {
          var data = new FormData();
          data.append('fulAvatar', $('#fileToUpload')[0].files[0]);
          $.ajax({
              url: '/api/uploadImg',
              type: 'POST',
              data: data,
              cache: false,
              contentType: false, //不可缺參數(shù)
              processData: false, //不可缺參數(shù)
              success: function(data) {
                  console.log('-------upload img:', data);
              },
              error: function() {
                  console.log('error');
              }
          });
        }
    }
});

注意:由于我們?cè)賏pp.js中用了靜態(tài)服務(wù)app.use(express.static(path.join(__dirname, ‘public’)));夭拌,
將所有的靜態(tài)資源文件都托管到public文件夾里。后續(xù)操作中如果需要調(diào)用public中的圖片什么的衷咽,
無論你在哪個(gè)文件夾鸽扁,都把自己當(dāng)成是在public文件夾即可。
例如這邊可以使用類似![](/avatar/0.2991991519596453.jpg)
來引用public下avatar中的圖片

3镶骗、后臺(tái)項(xiàng)目中使用:

// routes/index.js中
// 上傳圖片
router.route('/api/uploadImg').all(verifyToken).post(api.uploadImg);

// routes/api.js中
const formidable = require('formidable');
var sd = require("silly-datetime");
const fs = require('fs');
var AVATAR_UPLOAD_FOLDER = '/avatar/'; // 上傳圖片存放路徑桶现,注意在本項(xiàng)目public文件夾下面新建avatar文件夾

// 上傳圖片
exports.uploadImg = function (req, res, next) {
    var form = new formidable.IncomingForm();   //創(chuàng)建上傳表單
    form.encoding = 'utf-8';        //設(shè)置編輯
    form.uploadDir = 'public' + AVATAR_UPLOAD_FOLDER;    //設(shè)置上傳目錄
    form.keepExtensions = true;  //保留后綴
    form.maxFieldsSize = 2 * 1024 * 1024;   //文件大小
    
    form.parse(req, function (err, fields, files) {
    
        if (err) {
            return res.json({
                "code": 500,
                "message": "內(nèi)部服務(wù)器錯(cuò)誤"
            })
        }
        
        // 限制文件大小 單位默認(rèn)字節(jié) 這里限制大小為2m
        if (files.fulAvatar.size > form.maxFieldsSize) {
            fs.unlink(files.fulAvatar.path)
            return res.json({
                "code": 401,
                "message": "圖片應(yīng)小于2M"
            })
        }
        
        var extName = '';  //后綴名
        switch (files.fulAvatar.type) {
            case 'image/pjpeg':
                extName = 'jpg';
                break;
            case 'image/jpeg':
                extName = 'jpg';
                break;
            case 'image/png':
                extName = 'png';
                break;
            case 'image/x-png':
                extName = 'png';
                break;
        }
        
        if (extName.length == 0) {
            return res.json({
                "code": 404,
                "message": "只支持png和jpg格式圖片"
            })
        }
        
        //使用第三方模塊silly-datetime
        var t = sd.format(new Date(), 'YYYYMMDDHHmmss');
        //生成隨機(jī)數(shù)
        var ran = parseInt(Math.random() * 8999 + 10000);
        
        // 生成新圖片名稱
        var avatarName = t + '_' + ran + '.' + extName;
        // 新圖片路徑
        var newPath = form.uploadDir + avatarName;
        
        // 更改名字和路徑
        fs.rename(files.fulAvatar.path, newPath, function (err) {
            if (err) {
                return res.json({
                    "code": 401,
                    "message": "圖片上傳失敗"
                })
            }
            return res.json({
                "code": 200,
                "message": "上傳成功",
                result: AVATAR_UPLOAD_FOLDER + avatarName
            })
        })
    });

}

上傳文件測(cè)試后,可以到上傳文件夾public/avatar下查看是否成功

源碼: GitHub

下一篇文章打算使用react簡單構(gòu)建前端頁面鼎姊,使用這邊開發(fā)的接口進(jìn)行開發(fā)骡和。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末相赁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子慰于,更是在濱河造成了極大的恐慌噪生,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件东囚,死亡現(xiàn)場(chǎng)離奇詭異跺嗽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)页藻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門桨嫁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人份帐,你說我怎么就攤上這事璃吧。” “怎么了废境?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵畜挨,是天一觀的道長。 經(jīng)常有香客問我噩凹,道長巴元,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任驮宴,我火速辦了婚禮逮刨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堵泽。我一直安慰自己修己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布迎罗。 她就那樣靜靜地躺著睬愤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纹安。 梳的紋絲不亂的頭發(fā)上尤辱,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音钻蔑,去河邊找鬼啥刻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛咪笑,可吹牛的內(nèi)容都是我干的可帽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼窗怒,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼映跟!你這毒婦竟也來了蓄拣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤努隙,失蹤者是張志新(化名)和其女友劉穎球恤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荸镊,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咽斧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躬存。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片张惹。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岭洲,靈堂內(nèi)的尸體忽然破棺而出宛逗,到底是詐尸還是另有隱情,我是刑警寧澤盾剩,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布雷激,位于F島的核電站,受9級(jí)特大地震影響告私,放射性物質(zhì)發(fā)生泄漏屎暇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一德挣、第九天 我趴在偏房一處隱蔽的房頂上張望恭垦。 院中可真熱鬧快毛,春花似錦格嗅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至襟衰,卻和暖如春贴铜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瀑晒。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工绍坝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苔悦。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓轩褐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玖详。 傳聞我的和親對(duì)象是個(gè)殘疾皇子把介,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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