HTML5 圖片上傳淑廊,預(yù)覽逗余,限制圖片原始寬高和尺寸

前言:該解決方案只支持IE10及以上,目前來(lái)看IE9及以下所占的份額越來(lái)越小了季惩,如果在項(xiàng)目不需要考慮IE9及以下的情況下录粱,使用HTML5是最好的方案。

HTML上傳文件的標(biāo)簽

<input type="file">
最基本的上傳文件標(biāo)簽

<input type="file" multiple="">
可以進(jìn)行多文件上傳的標(biāo)簽

<input type="file" accept=".jpg,.gif">
可以對(duì)上傳類型進(jìn)行限制的標(biāo)簽

使用accept屬性對(duì)上傳文件類型進(jìn)行限制很方便画拾,但是很容易被破解啥繁。如下圖:

upload文件夾中的全部文件

使用accept進(jìn)行控制只允許上傳jpg后綴的文件:
<input type="file" accept=".jpg">
點(diǎn)擊上傳按鈕如下圖:

只顯示jpg文件的選擇文件框

但是當(dāng)我們選擇右下角的文件類型為所有文件,如下圖:

顯示全部文件的文件框

所以目前看來(lái)使用accept屬性對(duì)上傳文件類型進(jìn)行限制基本上算是防君子不防小人了青抛。

JS對(duì)應(yīng)的事件和file控件DOM對(duì)象的接口

file控件上傳文件時(shí)觸發(fā)的事件是onchange旗闽。

file控件DOM對(duì)象提供了多個(gè)文件操作API:

  • FileList對(duì)象表示用戶選擇的文件列表,在HTML4中file控件內(nèi)只允許放置一個(gè)文件,但在HTML5中通過(guò)添加multiple屬性适室,file控件內(nèi)允許放置多個(gè)文件嫡意。控件內(nèi)的每一個(gè)用戶選擇的文件都是一個(gè)file對(duì)象亭病,而FileList就是這些file對(duì)象的列表鹅很,代表用戶選擇的所有文件。
    調(diào)用方法:假設(shè)file控件DOM對(duì)象名為file罪帖,則調(diào)用方法為file.files

  • file對(duì)象有兩個(gè)屬性邮屁,一個(gè)是name整袁,代表文件名不包含文件的路徑;一個(gè)是lastModifiedDate佑吝,表示文件最后被修改的日期坐昙。
    調(diào)用方法:假設(shè)file控件DOM對(duì)象名為file,則第一個(gè)用戶選擇文件的調(diào)用方法為file.files[0]芋忿。

  • HTML5中Blob表示二進(jìn)制原始數(shù)據(jù)炸客,它提供一個(gè)slice()方法,可以通過(guò)這個(gè)方法訪問(wèn)到字節(jié)內(nèi)部的原始數(shù)據(jù)塊戈钢。事實(shí)上痹仙,上面提到的file對(duì)象繼承了Blob對(duì)象。Blob對(duì)象的兩個(gè)屬性殉了,
    size:表示一個(gè)對(duì)象的字節(jié)長(zhǎng)度开仰。
    type:表示一個(gè)對(duì)象的MIME類型,如若是未知類型返回空字符串薪铜。
    調(diào)用方法:沒(méi)有調(diào)用方法众弓,只是file控件DOM對(duì)象的file對(duì)象繼承了Blob對(duì)象。

FileReader接口

四個(gè)方法:

方法名 參數(shù) 描述
readAsBinaryString() file 將文件讀取為二進(jìn)制字符串隔箍,通常將它傳到后端谓娃,后端可以通過(guò)這段字符串存儲(chǔ)文件
readAsDataURL() file 將文件讀取為一段data url字符串,事實(shí)上是將小文件以一種特格式的URL地址直接讀取到頁(yè)面蜒滩。小文件通常指圖片與html等格式文件
readAsText() file [encoding] 將文件以文本的方式讀取滨达,其中第二個(gè)參數(shù)為文本的編碼
abort() (none) 中斷讀取操作

監(jiān)聽(tīng)事件:

事件 描述
onabort 數(shù)據(jù)讀取中斷時(shí)發(fā)生
onerror 數(shù)據(jù)讀取出錯(cuò)時(shí)發(fā)生
onloadstart 數(shù)據(jù)讀取開(kāi)始時(shí)發(fā)生
onload 數(shù)據(jù)讀取成功完成時(shí)發(fā)生
onloadend 數(shù)據(jù)讀取完成時(shí)發(fā)生無(wú)論讀取成功還是失敗
onprogess 數(shù)據(jù)讀取中

一個(gè)簡(jiǎn)單的例子:
只實(shí)現(xiàn)了IE10以上的圖片上傳預(yù)覽,已經(jīng)獲取文件類型帮掉,大小和寬高弦悉,并且打印了日志,但是沒(méi)有阻止上傳蟆炊。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form action="">
        <div><img src="" alt=""></div>
        <input type="file" multiple="">
    </form>
<script>
    var img1 = document.querySelector('img');
    var div = document.querySelector('div');
    var input = document.querySelector('input');
    input.onchange = function () {
        if (input.files && input.files[0]) {
            if(input.files[0].type == "image/jpeg" || input.files[0].type == "image/gif" || input.files[0].type == "image/png"){
                var byteSize = input.files[0].size / 1024;
                if(byteSize <= 250){
                    var reader = new FileReader();
                    reader.readAsDataURL(input.files[0]);
                    reader.onload = function(ev){
                        var txt = ev.target.result;
                        var img = new Image();
                        img.src = txt;
                        img.onload = function(){
                            if(img.width <= 500 && img.height <= 500){
                                console.log("圖片沒(méi)有錯(cuò)");
                                img1.src = txt;
                            }else{
                                console.log("尺寸不對(duì) " + img.width + "*" + img.height);
                            }
                        }
                    }
                }else{
                    console.log("文件大小超出 " + byteSize);
                }
            }else{
                console.log("文件類型不對(duì) " + input.files[0].type);
            }
        }else{
            console.log("沒(méi)有上傳稽莉,使用默認(rèn)");
        }
    }
</script>
</body>
</html>

參考:

下一步目標(biāo):實(shí)現(xiàn)拖拽上傳

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涩搓,隨后出現(xiàn)的幾起案子污秆,更是在濱河造成了極大的恐慌劈猪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件良拼,死亡現(xiàn)場(chǎng)離奇詭異战得,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)庸推,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)常侦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人贬媒,你說(shuō)我怎么就攤上這事聋亡。” “怎么了际乘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵坡倔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我脖含,道長(zhǎng)罪塔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任养葵,我火速辦了婚禮征堪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘港柜。我一直安慰自己请契,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布夏醉。 她就那樣靜靜地躺著爽锥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畔柔。 梳的紋絲不亂的頭發(fā)上氯夷,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音靶擦,去河邊找鬼腮考。 笑死,一個(gè)胖子當(dāng)著我的面吹牛玄捕,可吹牛的內(nèi)容都是我干的踩蔚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼枚粘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼馅闽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤福也,失蹤者是張志新(化名)和其女友劉穎局骤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體暴凑,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峦甩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了现喳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凯傲。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嗦篱,靈堂內(nèi)的尸體忽然破棺而出泣洞,到底是詐尸還是另有隱情,我是刑警寧澤默色,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站狮腿,受9級(jí)特大地震影響腿宰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缘厢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一吃度、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贴硫,春花似錦椿每、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至挖诸,卻和暖如春汁尺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背多律。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工痴突, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狼荞。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓辽装,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親相味。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拾积,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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