圖片上傳并回顯Ajax異步篇

圖片上傳并回顯Ajax異步篇

圖片如何無刷新的上傳到服務(wù)器呢?繼前兩篇文章后,我們來實戰(zhàn)一下如何無刷新的異步上傳圖片拷呆,我們還是先看一下效果

圖片上傳并回顯Ajax異步篇

在實戰(zhàn)前呢闲坎,我們需要做些準備工作。比如說茬斧,了解一下FormData對象

“FormData對象用以將數(shù)據(jù)編譯成鍵值對腰懂,以便用XMLHttpRequest來發(fā)送數(shù)據(jù)。其主要用于發(fā)送表單數(shù)據(jù)项秉,但亦可用于發(fā)送帶鍵數(shù)據(jù)(keyed data)绣溜,而獨立于表單使用。如果表單enctype屬性設(shè)為multipart/form-data 娄蔼,則會使用表單的submit()用來提交表單怖喻,這個方法和提交表單按鈕很類似底哗。")方法來發(fā)送數(shù)據(jù),從而锚沸,發(fā)送數(shù)據(jù)具有同樣形式艘虎。”

這是官方的講解咒吐,我來說一下我的理解,我們new 一個FormData( $(form) )對象時属划,它會幫我們把form表單里的數(shù)據(jù)封裝成鍵值對的形式恬叹,以前我們都時用input的submit進行提交數(shù)據(jù),當(dāng)我們拿到這個form對象的時候同眯,我們就可以用ajax模擬input的submit提交绽昼,既然知道了這些,我們就開始一步步的編程吧须蜗。

我們先完善一下界面硅确,看一下下面的代碼

這是body里的內(nèi)容,不要忘了form明肮,只是沒有了action菱农,enctype屬性也要設(shè)置好,我的上一篇文章有對enctype的講解 圖片上傳并回顯后端篇

<body>
<form id="formTag1" enctype="multipart/form-data">
    <div class="uploadImgBtn" id="uploadImgBtn">
        <input class="uploadImg" type="file" name="file" id="file1">
    </div>
</form>
</body>

這是css里的內(nèi)容

<style>
    .uploadImgBtn {
        width: 100px;
        height: 100px;
        cursor: pointer;
        position: relative;
        background: url("img/plus.png") no-repeat;
        -webkit-background-size: cover;
        background-size: cover;
    }

    .uploadImgBtn .uploadImg {
        position: absolute;
        right: 0;
        top: 0;
        width: 100%;
        height: 100%;
        opacity: 0;
        cursor: pointer;
    }

    .pic {
        width: 100px;
        height: 100px;
    }

    .pic img {
        width: 100%;
        height: 100%;
    }
</style>

基本的樣式都已經(jīng)編寫完成柿估,我們來參觀一下吧


好了循未,我們開始編寫我們的jquery代碼吧,在編寫之前我們理一下思路秫舌,當(dāng)用戶選擇好圖片時的妖,即input 的change事件觸發(fā)時,我們就把圖片上傳到服務(wù)器足陨,服務(wù)端返回圖片的url嫂粟,我們拿到這個url時,把它設(shè)置為我們input外面盒子的背景圖墨缘。既然知道了思路我們就編寫一下代碼吧

<script>
    $(document).ready(function(){
        $("#file1").on("change", upload );
    })

    function upload(){
        /**
         * 我們存一下this對象星虹,
         * 我們將在ajax的回調(diào)函數(shù)中,
         * 將要用這個對象镊讼,
         * 用它來改變父盒子的背景圖
         *
         */
        var self = this;
        //如果不理解我寫的搁凸,可以看看我的前幾篇文章
        $.ajax({
            url: "/UpImg/upload",
            type: "post",
            dataType: "json",
            cache: false,
            data: new FormData($("#formTag1")[0]),
            processData: false,// 不處理數(shù)據(jù)
            contentType: false, // 不設(shè)置內(nèi)容類型
            success: function(data){
                /*
                    后端返回的數(shù)據(jù)格式為
                    {"url": "xxxxxx"}
                 */
                $(self).parent().css({
                    "background-image": "url("+data.url+")"
                })
            }

        })
    }

</script>

我們把change事件的執(zhí)行函數(shù)獨立出來,因為我們可能還需要用到這個函數(shù)狠毯。函數(shù)也沒有什么難點护糖,就是保存一個this對象,加一個ajax嚼松。我們來看一下效果圖

我們已經(jīng)實現(xiàn)了change事件觸發(fā)時嫡良,我們把圖片上傳到服務(wù)器锰扶,我們也可以改變我們已經(jīng)選擇好的圖片,到這里肯定還沒有結(jié)束寝受。因為用戶只是選擇了一張圖片坷牛,如果我們的業(yè)務(wù)需要用戶上傳多張圖片呢,那我們這個肯定就不滿足要求了很澄,我們需要再給我們的代碼添加一些功能京闰。比如說,當(dāng)用戶選擇好一張后甩苛,再生成一個form->input標(biāo)簽蹂楣,然后就這樣遞歸;但我們還需要加一些條件讯蒲,就是當(dāng)用戶改變已經(jīng)選擇好的圖片時痊土,我們不能生成form->input標(biāo)簽。好了需求大概就是這樣的墨林。

我們來理一下思路:

1赁酝、我們需要給form標(biāo)簽外面添加一個盒子,我們把所有生成的form標(biāo)簽都放里面旭等。

2酌呆、我們需要有一個計數(shù)器,記錄form的個數(shù)搔耕,也是通過這個我們可以給form和input設(shè)置不同的id

3肪笋、我們需要判斷當(dāng)前change事件是第幾個,如果它的id中的數(shù)值部分和count一樣度迂,我們就新生成一個form藤乙,否則就返回

我們先看一下我們的html部分

<body>
<div id="formBox">
    <form id="formTag1" enctype="multipart/form-data">
        <div class="uploadImgBtn" id="uploadImgBtn">
            <input class="uploadImg" type="file" name="file" id="file1">
        </div>
    </form>
</div>
</body>

我們來編碼實現(xiàn)一下js

<script>
    //作為第幾個form的標(biāo)志
    var count = 1;
    $(document).ready(function(){
        $("#file1").on("change", upload );
    });
    function upload(){
        var self = this;

        //獲得它是第幾個form表單
        var num = this.getAttribute("id").replace(/[a-zA-Z]/g,"");
        //構(gòu)造form的選擇器
        var $form = "#formTag" +num;

        $.ajax({
            url:"/UpImg/upload",
            type:"post",
            dataType:"json",
            cache:false,
            data: new FormData($($form)[0]),
            processData: false,// 不處理數(shù)據(jù)
            contentType: false, // 不設(shè)置內(nèi)容類型
            success:function(data){
                //設(shè)置背景為我們選擇的圖片
                $(self).parent().css({
                    "background-image": "url("+data.url+")"
                });

                //我們再生成一個form
                if(count == num ){
                    //count計數(shù)加1
                    count +=1;
                    var str = '<form id="formTag'+count+'" enctype="multipart/form-data">'+
                        '<div class="uploadImgBtn" id="uploadImgBtn">'+
                        '<input class="uploadImg" type="file" name="file" id="file'+count+'">'+
                        '</div>'+
                        '</form>   ';
                    //向最外面的盒子添加form    
                    $("#formBox").append($(str));
                    //構(gòu)造input的選擇器
                    var $sel = "#file"+count;
                    //為新生成的input綁定change事件
                    $($sel).on("change", upload );

                }else{
                    //如果不等于
                    return false;
                }
            }
        });
    }
</script>

這樣的話我們基本就實現(xiàn)了我們的效果,就如開頭中的效果惭墓,這個是可以無限添加form的坛梁,到時候可以給count設(shè)置一個上界,根據(jù)自己的業(yè)務(wù)來調(diào)整吧腊凶,到此我們的圖片上傳并回顯系列就算完結(jié)了;

聽說520快到了划咐,我們是不是需要new一個會說話的對象呢,520的時候我們就來實戰(zhàn)new一個對象吧钧萍,也是作為一個禮物送給大家呢(手動滑稽)

圖片上傳并回顯系列
如何用input標(biāo)簽上傳多個圖片并回顯
圖片上傳并回顯后端篇

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褐缠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子风瘦,更是在濱河造成了極大的恐慌队魏,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胡桨,居然都是意外死亡官帘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門昧谊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刽虹,“玉大人,你說我怎么就攤上這事呢诬∮空埽” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵尚镰,是天一觀的道長阀圾。 經(jīng)常有香客問我,道長钓猬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任撩独,我火速辦了婚禮敞曹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘综膀。我一直安慰自己澳迫,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布剧劝。 她就那樣靜靜地躺著橄登,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讥此。 梳的紋絲不亂的頭發(fā)上拢锹,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音萄喳,去河邊找鬼卒稳。 笑死,一個胖子當(dāng)著我的面吹牛他巨,可吹牛的內(nèi)容都是我干的充坑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼染突,長吁一口氣:“原來是場噩夢啊……” “哼捻爷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起份企,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤也榄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后司志,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體手蝎,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡榕莺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了棵介。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钉鸯。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖邮辽,靈堂內(nèi)的尸體忽然破棺而出唠雕,到底是詐尸還是另有隱情,我是刑警寧澤吨述,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布岩睁,位于F島的核電站,受9級特大地震影響揣云,放射性物質(zhì)發(fā)生泄漏捕儒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一邓夕、第九天 我趴在偏房一處隱蔽的房頂上張望刘莹。 院中可真熱鬧,春花似錦焚刚、人聲如沸点弯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抢肛。三九已至,卻和暖如春碳柱,著一層夾襖步出監(jiān)牢的瞬間捡絮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工莲镣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锦援,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓剥悟,卻偏偏與公主長得像灵寺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子区岗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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

  • 圖片上傳并回顯后端篇 我們先看一下效果 繼上一篇的圖片上傳和回顯略板,我們來實戰(zhàn)一下圖片上傳的整個過程,今天我們將打通...
    奇跡迪閱讀 5,687評論 3 6
  • 前端無法像原生APP一樣直接操作本地文件慈缔,否則的話打開個網(wǎng)頁就能把用戶電腦上的文件偷光了叮称,所以需要通過用戶觸發(fā),用...
    雷波_viho閱讀 821評論 0 1
  • 本文包括:1、文件上傳概述2瓤檐、利用 Commons-fileupload 組件實現(xiàn)文件上傳3赂韵、核心API——Dis...
    廖少少閱讀 12,546評論 5 91
  • 如果不考慮ie9兼容性祭示,實現(xiàn)【上傳圖片】大致的思路如下: 由于公司是將所有上傳的圖片都放到【代理服務(wù)器】里。所以【...
    kakaguo閱讀 5,977評論 1 4
  • 最近項目需要使用 Angular谴古,對于初學(xué) Angular 的我只能硬著頭皮上了质涛,項目中有一個需求是文件上傳,磕磕...
    雖萬萬人吾往矣閱讀 18,264評論 3 20