html5+express上傳多圖

在web開發(fā)中上傳圖片是一個很常見的操作,本文簡單介紹一下通過jQuery結(jié)合html5中的一些新標(biāo)簽實現(xiàn)圖片上傳和客戶端預(yù)覽硬梁。
項目地址: github

** 效果圖 **

1.png

主要是用到的插件

  1. web開發(fā)框架express
  2. nodemon插件,實現(xiàn)服務(wù)器端js修改后的自動重啟
  3. gulp實現(xiàn)瀏覽器端js代碼的自動化構(gòu)建
  4. jQuery

實現(xiàn)思路:客戶端通過base64方式把圖片上傳到服務(wù)器端,服務(wù)器端解析數(shù)據(jù)轉(zhuǎn)換成文件.客戶端處理文件可以使用FileReader

//gulpfile.js
var gulp = require('gulp')
// nodemon服務(wù)器端js修改后重啟服務(wù)
var nodemon = require('gulp-nodemon')
var browserSync = require('browser-sync').create()
var concat = require('gulp-concat'),
    uglify = require('gulp-uglify')
//配置nodemon監(jiān)聽js撞鹉、html文件的改變 重啟node服務(wù)器
gulp.task('nodemon',function(){
    nodemon({
        ignore:['gulpfile.js','node_modules/','public/**/*.*'], //忽略不需要監(jiān)視重啟的文件
        script:'index.js',
        ext:'js html'
    }).on('start',function(){
        browserSync.init({
            files:['public/**/*.*','views/**'],
            proxy:'http://localhost:3000', //設(shè)置代理運行本地的3000端口
            port:5000, //設(shè)置browser-sync的運行端口號
        },function(){
            console.log('瀏覽器已刷新')
        })
    })
})
gulp.task('dist',function(){
    gulp.src(['./public/js/*.js'])
        .pipe(concat('dist.js'))
        .pipe(uglify())
        .pipe(gulp.dest('./public/dist'))
})
gulp.task('default',['nodemon'])
<div id="upload">
    <!--頁面中創(chuàng)建一個隱藏的file標(biāo)簽-->
    <input type="file" name="fileUpload" id="fileUpload" style="width:0;height:0">
    <button id="fileOpenFolder"><i class="fa fa-folder-open-o"></i></button>
    <button id="fileUploadAll"><i class="fa fa-upload"></i></button>
    <div class="upload-container">
        <ul id="h5ImgUploadList">
        </ul>
    </div>
</div>
//客戶端js代碼
$.fn.extend(
    {
        'h5Upload':function(){
            var imgList = [] //保存圖片的數(shù)據(jù)

            //點擊打開文件夾按鈕 開始選擇文件
            this.find('#fileOpenFolder').click(function(){
                $('#fileUpload').click()
            })
            var that = this
            //向服務(wù)器端上傳文件
            this.find('#fileUploadAll').click(function(){
                if(imgList.length == 0){
                    console.log('請選擇要上傳的圖片文件')
                    return false
                }
                //把多張圖片用@分割上傳服務(wù)器端
                var data = ''
                that.find('img').each(function(){
                    data += $(this).attr("src")+"@"
                })

                $.ajax({
                    method:'post',
                    data:{imgData:data},
                    url:'/common/api/file_upload',
                    success:function(res){
                        console.dir(res)
                    },
                    error:function(err){
                        console.dir(err)
                    }
                })
            })


            // 添加刪除圖片效果,點擊刪除按鈕后刪除指定位置的圖片
            $('#h5ImgUploadList').on('click','.del',function(){
                var currentImgIndex = $('#h5ImgUploadList .del').index(this)
                imgList.splice(currentImgIndex,1)
                initImgHtml()
            })

            $('#fileUpload').change(function(){
                imgList.push(this.files[0])
                initImgHtml()
            })

            //圖片選擇之后渲染頁面內(nèi)容
            function initImgHtml(){
                $('#h5ImgUploadList').html('')
                imgList.forEach(function(imgData){
                    var reader = new FileReader()
                    reader.readAsDataURL(imgData)
                    reader.onload = function(){
                        var $img = $('<li><img><i class="del fa fa-remove"></i></li>')
                        $img.find('img').attr('src',this.result)
                        $('#h5ImgUploadList').append($img)
                        $img.load(function(){
                            console.dir(this)
                        })
                    }
                })
            }
        }
    }
)
$('#upload').h5Upload()
//服務(wù)器端js代碼 接收數(shù)據(jù)進行處理
app.post('/common/api/file_upload',(req,res)=>{
    var imgDataArr = req.body.imgData
    //console.log(req.body)
    //為了防止文件同名,使用時間戳加隨機數(shù)的方式命名文件
    var imgList = []
    imgDataArr.split('@').forEach(imgData=>{
        if(imgData!=""){
            var fileName = Date.now().toString()+Math.ceil(Math.random()*10000)+".jpg"
            imgList.push("/upload/"+fileName)
            //傳遞的數(shù)據(jù)進行替換
            var base64Data = imgData.replace(/^data:image\/\w+;base64,/,"")
            var dataBuffer = new Buffer(base64Data,'base64')
            fs.writeFile('./public/upload/'+fileName,dataBuffer,err=>{
                if(err){
                    console.log(err)
                }
                else{
                }
            })
        }
    })
    res.json({
        status:'y',
        msg:'保存成功',
        data:imgList.join(',')
    })
})


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末败富,一起剝皮案震驚了整個濱河市纵寝,隨后出現(xiàn)的幾起案子掩浙,更是在濱河造成了極大的恐慌舆绎,老刑警劉巖鲤脏,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吕朵,居然都是意外死亡猎醇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門努溃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硫嘶,“玉大人,你說我怎么就攤上這事梧税÷偌玻” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵第队,是天一觀的道長哮塞。 經(jīng)常有香客問我,道長凳谦,這世上最難降的妖魔是什么忆畅? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮尸执,結(jié)果婚禮上家凯,老公的妹妹穿的比我還像新娘缓醋。我一直安慰自己,他們只是感情好绊诲,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布送粱。 她就那樣靜靜地躺著,像睡著了一般驯镊。 火紅的嫁衣襯著肌膚如雪葫督。 梳的紋絲不亂的頭發(fā)上竭鞍,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天板惑,我揣著相機與錄音,去河邊找鬼偎快。 笑死冯乘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晒夹。 我是一名探鬼主播裆馒,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丐怯!你這毒婦竟也來了喷好?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤读跷,失蹤者是張志新(化名)和其女友劉穎梗搅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體效览,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡无切,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了丐枉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哆键。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瘦锹,靈堂內(nèi)的尸體忽然破棺而出籍嘹,到底是詐尸還是另有隱情,我是刑警寧澤弯院,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布噩峦,位于F島的核電站,受9級特大地震影響抽兆,放射性物質(zhì)發(fā)生泄漏识补。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一辫红、第九天 我趴在偏房一處隱蔽的房頂上張望凭涂。 院中可真熱鬧祝辣,春花似錦、人聲如沸切油。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澎胡。三九已至孕荠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間攻谁,已是汗流浹背稚伍。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留戚宦,地道東北人个曙。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像受楼,于是被迫代替她去往敵國和親垦搬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

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