自己的一套多圖上傳

搬過(guò)來(lái)一個(gè)老文他挎。
多圖上傳在各個(gè)網(wǎng)站都是個(gè)很常見的功能筝尾,對(duì)于剛?cè)腴T前端不久的新人來(lái)說(shuō),網(wǎng)上插件一大堆办桨,隨便拿來(lái)就能用是個(gè)正解筹淫。菜鳥的我喜歡折騰,閑來(lái)無(wú)事呢撞,自己寫個(gè)玩玩损姜。
去原文看看

先來(lái)復(fù)習(xí)幾個(gè)小知識(shí)

FileReader:
FileReader主要用于將文件內(nèi)容讀入內(nèi)存,通過(guò)一系列異步接口殊霞,可以在主線程中訪問(wèn)本地文件摧阅。
使用FileReader對(duì)象,web應(yīng)用程序可以異步的讀取存儲(chǔ)在用戶計(jì)算機(jī)上的文件(或者原始數(shù)據(jù)緩沖)內(nèi)容绷蹲,可以使用File對(duì)象或者Blob對(duì)象來(lái)指定所要處理的文件或數(shù)據(jù)棒卷。
創(chuàng)建實(shí)例:
var reader = new FileReader();

方法:
abort():void 終止文件讀取操作 
readAsArrayBuffer(file):void 異步按字節(jié)讀取文件內(nèi)容,結(jié)果用ArrayBuffer對(duì)象表示 
readAsBinaryString(file):void 異步按字節(jié)讀取文件內(nèi)容瘸右,結(jié)果為文件的二進(jìn)制串 
readAsDataURL(file):void 異步讀取文件內(nèi)容娇跟,結(jié)果用data:url的字符串形式表示 
readAsText(file,encoding):void 異步按字符讀取文件內(nèi)容,結(jié)果用字符串形式表示 

事件:
onabort 當(dāng)讀取操作被中止時(shí)調(diào)用 
onerror 當(dāng)讀取操作發(fā)生錯(cuò)誤時(shí)調(diào)用 
onload 當(dāng)讀取操作成功完成時(shí)調(diào)用 
onloadend 當(dāng)讀取操作完成時(shí)調(diào)用,不管是成功還是失敗 
onloadstart 當(dāng)讀取操作將要開始之前調(diào)用 
onprogress 在讀取數(shù)據(jù)過(guò)程中周期性調(diào)用 

有點(diǎn)神奇了太颤,然后了解一下base64

百度百科上的解釋
Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一苞俘,Base64就是一種基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的方法×湔拢可查看RFC2045~RFC2049吃谣,上面有MIME的詳細(xì)規(guī)范乞封。
Base64編碼是從二進(jìn)制到字符的過(guò)程,可用于在HTTP環(huán)境下傳遞較長(zhǎng)的標(biāo)識(shí)信息岗憋。例如肃晚,在Java Persistence系統(tǒng)Hibernate中,就采用了Base64來(lái)將一個(gè)較長(zhǎng)的唯一標(biāo)識(shí)符(一般為128-bit的UUID)編碼為一個(gè)字符串仔戈,用作HTTP表單和HTTP GET URL中的參數(shù)关串。在其他應(yīng)用程序中,也常常需要把二進(jìn)制數(shù)據(jù)編碼為適合放在URL(包括隱藏表單域)中的形式监徘。此時(shí)晋修,采用Base64編碼具有不可讀性,需要解碼后才能閱讀凰盔。

有點(diǎn)不知所云墓卦,簡(jiǎn)單來(lái)說(shuō),base64就是一大串不可讀字符串户敬,將圖片文件直接轉(zhuǎn)為base64落剪,就可以將圖片以文本的方式直接傳給后臺(tái)。

說(shuō)說(shuō)實(shí)現(xiàn)原理

有了上面的復(fù)習(xí)尿庐,多圖片上傳似乎有了點(diǎn)眉目忠怖。
1.用戶每上傳一次圖片,就將這張圖片轉(zhuǎn)化為base64抄瑟,放進(jìn)數(shù)組
2.提交的時(shí)候把數(shù)組當(dāng)做普通數(shù)據(jù)直接傳到后臺(tái)

<style>
    *{
        padding:0;
        margin:0;
    }
    body{
        background:#eee;
    }
    .wrapper-upload{
        width:500px;
        height:400px;
        margin: 100 auto;
        box-shadow: 0 0 5px #ccc;
        border-radius: 10px;
        background-color: #fff;
        position: relative;
        overflow: hidden;
    }
    .wrapper-upload input[type=file]{
        display: none;
    }
    .file-list ul{
        list-style: none;
        text-align: center;
        margin-top:10px;
    }
    .file-list li{
        width:130px;
        height:100px;
        display: inline-block;
        overflow: hidden;
        border-radius: 5px;
        margin:5px;
        box-shadow: 0 0 5px #000;
        position:relative;
        transition: all 1s ease;
    }
    .file-list li img.imgs{
        height:100px;
    }
    .file-list li img.btn-del{
        position:absolute;
        left:50%;
        top:0;
        transform: translate(-50%,-50%);
        width:30px;
        opacity: 0;
        transition: all .5s ease;
        z-index: 3;
        cursor: pointer;
    }
    .file-list li:hover img.imgs{
        opacity: .6;
    }
    .file-list li:hover img.btn-del{
        opacity: 1;
        top:50%;
        display: block;
    }
    .btn-upload{
        position: absolute;
        bottom:10px;
        left:50%;
        display: block;
        padding: 0;
        width: 90px;
        height: 30px;
        background-color: orange;
        color: #fff;
        font-size: 16px;
        font-weight: 600;
        text-align: center;
        line-height: 30px;
        border-radius: 3px;
        transform: translate(-50%,0);
        cursor: pointer;
    }
</style>
<script>
$(function(){
    Upload.init();
});
var Upload = {
    init: function() {
        this.eventChange();
        this.deleteImg();
    },
    arrImg: [],   // 已上傳圖片的base64組成數(shù)組
    eventChange: function() {
        var that = this;
        $(document).on('change', '#upload', function(e) {
            if (that.arrImg.length >= 9) {
                alert('最多上傳9張圖片');
                return false;
            }
            var reader = new FileReader();
            var file = event.target.files[0];
            
            // 存在圖片就讀取為base64
            if (!file) {
                alert('未選擇任何圖片');
            }else{
                reader.readAsDataURL(file);
            }
            // 當(dāng)讀取操作成功完成時(shí)將圖片放進(jìn)數(shù)組脑又,然后遍歷出圖片
            reader.onload = function (e) {
                var imgBase64 = reader.result;
                that.arrImg.push(imgBase64);
                that.readerImg();
            }
        });
    },
    // 圖片遍歷到面板上
    readerImg: function() {
        var that = this;
        var strHtml = '';
        for (var i = 0; i < that.arrImg.length; i++) {
            strHtml += '<li> <img src="./img/del.svg"  data-index="' + i + '" class="btn-del" /> <img class="imgs" src="' + that.arrImg[i] + '"></li>';
        }
        $('.file-list ul').html(strHtml);
    },
    // 刪除圖片操作
    deleteImg: function() {
        var that = this;
        $(document).on('click', '.btn-del', function(){
            var index = $(this).attr('data-index');
            that.arrImg.splice(index, 1);
            that.readerImg();
        });
    }
};
</script>

預(yù)覽一下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锐借,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌往衷,老刑警劉巖钞翔,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異席舍,居然都是意外死亡布轿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門来颤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)汰扭,“玉大人,你說(shuō)我怎么就攤上這事福铅÷苊” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵滑黔,是天一觀的道長(zhǎng)笆包。 經(jīng)常有香客問(wèn)我环揽,道長(zhǎng),這世上最難降的妖魔是什么庵佣? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任歉胶,我火速辦了婚禮,結(jié)果婚禮上巴粪,老公的妹妹穿的比我還像新娘通今。我一直安慰自己,他們只是感情好肛根,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布辫塌。 她就那樣靜靜地躺著,像睡著了一般晶通。 火紅的嫁衣襯著肌膚如雪璃氢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天狮辽,我揣著相機(jī)與錄音一也,去河邊找鬼。 笑死喉脖,一個(gè)胖子當(dāng)著我的面吹牛椰苟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播树叽,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼舆蝴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了题诵?” 一聲冷哼從身側(cè)響起洁仗,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎性锭,沒(méi)想到半個(gè)月后赠潦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡草冈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年她奥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怎棱。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哩俭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拳恋,到底是詐尸還是另有隱情凡资,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布诅岩,位于F島的核電站讳苦,受9級(jí)特大地震影響带膜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸳谜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一膝藕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咐扭,春花似錦芭挽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至薛闪,卻和暖如春辛馆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豁延。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工昙篙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诱咏。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓苔可,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親袋狞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子焚辅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,322評(píng)論 25 707
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,787評(píng)論 0 15
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件苟鸯、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,124評(píng)論 4 61
  • 而已6閱讀 129評(píng)論 0 0
  • 又是一個(gè)不錯(cuò)的天氣同蜻,藍(lán)天白云,空氣格外清新早处,對(duì)于一連陰雨好幾天的浸在灰天灰地里埃仪,今天的心情也正如這天氣一般...
    灰叔漫畫閱讀 1,662評(píng)論 9 22