mootools無(wú)刷新上傳文件(圖片)插件

無(wú)刷新上傳的方法很多,比如:

  1. 利用現(xiàn)代瀏覽器的FormData掖桦。
  2. 利用現(xiàn)代瀏覽器的FileReader將圖片文件編程base64編碼荧呐。
  3. 利用類(lèi)庫(kù)(如jQuery)的ajax纷捞。
  4. 利用iframe祠肥。

最近接到一個(gè)項(xiàng)目要求兼容IE8+武氓,沒(méi)有選擇余地,只能用iframe了搪柑。原理如下:

<form action="upload.php" target="iframe" method="post" entype="mutipart/form-data">
  <input type="file" name="file"/>
  <iframe name="iframe" class="hide">
  </iframe>
</form>

這上述代碼里聋丝,最重要得就是** target="file" **索烹。它實(shí)現(xiàn)了使用隱藏的iframe上傳文件工碾。
這樣,我們就可以在上傳文件后返回給iframe結(jié)果百姓,再用js解析iframe里的內(nèi)容--或者是顯示圖片渊额,或者是顯示提示信息。

代碼如下:

/**
 * 利用隱藏iframe無(wú)刷新上傳圖片
 * usage:
 * var widget = new IframeUpload({
        container:'.container',//上傳的組件(帶+號(hào)的div)要放在哪個(gè)類(lèi)或者id里垒拢,隱藏的input也放在這里
        uploadUrl:'upload.php',
        deleteUrl:'delete.php',
        deleteMethod:'post',//可以不寫(xiě)旬迹,默認(rèn)是post
        max:5//最多上傳幾張圖片
    });
 * @type {Class}
 */
var IframeUpload = new Class({
    count:0,//記錄目前頁(yè)面上存在的iframe
    initialize:function(options){
        var othis = this;
        var defaultOptions = {
            container:"file",
            marginRight:10,//upload widget 間隔
            className:'iframe-upload-widget',//給adopt進(jìn)頁(yè)面的form加一個(gè)類(lèi),最后刪除
            max:5,
            interval:50,
            ajaxName:'file',//iframe 上傳圖片時(shí)求类,圖片的name
            imageName:'file[]',//最后一次性上傳圖片時(shí)圖片的name
            uploadUrl:"upload.php",
            method:'post',//upload method
            deleteUrl:'',
            deleteMethod:'post',
            deleteTag:'id',//刪除一張圖片時(shí)奔垦,指定隱藏input的name
            enctype:"multipart/form-data",
            onSuccess:function(html){
                //console.log(html)
                // var othis = this.self;
                var arr = html.split(";");
                if(arr.length == 2){
                    this.appendImage(arr[0]);
                    this.setValue(arr[1]);
                }else{
                    Dialog.alert(html);
                }
            }
        };

        if(typeOf(options) == "object"){
            var opt = this.opt = Object.merge(defaultOptions,options);
        }else{
            var opt = this.opt = defaultOptions;
        }
        var classOrId = opt.container;
        var first = classOrId.substring(0,1);
        if(first == "."){
            othis.container = $$(classOrId);
        }else if(first == "#"){
            alert("container can not start with #");
        }else{
            othis.container = $(classOrId);
        }
        othis.init();
    },
    init:function(){
        this.createInput();
    },
    clear:function(){
        var othis = this;
        $$("."+othis.opt.className).dispose();
    },
    getIframeBody:function(iframe){
        return iframe.contentWindow.document.body;
    },
    listen:function(iframe,input,wrap,tagIdInput){
        var othis = this;
        var opt = othis.opt;

        var timeout = setInterval(function(){
            var html = othis.getIframeBody(iframe).innerHTML.trim();
            if(html != ""){
                othis.getIframeBody(iframe).innerHTML = "";
                clearInterval(timeout);
                if(othis.count < opt.max){
                    othis.createInput();
                }
                opt.onSuccess.bind({
                    self:othis,
                    setValue:function(value){
                        input.set("value",value);
                        tagIdInput.set("value",value);
                    },
                    appendImage:function(imageUrl){
                        othis.appendImage(wrap,imageUrl);
                    },
                    input:input,
                    tagInput:tagIdInput,
                    div:wrap
                })(html);
            }
        },opt.interval);
    },
    uuid:function(num){
        var letters = ['a','b','c','d','e','f','g','h','i','1','2','3','4','5','6','7','8','9'];
        if(typeOf(num) != "number"){
            num = 8;
        }
        var code = "";
        for(var i = 0;i<num;i++){
            code += letters.getRandom();
        }
        return code;
    },
    appendImage:function(wrap,imageUrl){
        wrap.setStyle("background-image","url("+imageUrl+")");
    },
    createInput:function(){
        var othis = this;
        var opt = othis.opt;
        othis.count ++;
        var iframeName = othis.uuid();
        var mapId = othis.uuid();//upload div 上綁定mapId,通過(guò)這個(gè)id找到對(duì)應(yīng)的隱藏input

        var wrap,form,input,iframe,tagIdInput,hiddenInput;

        input = new Element("input",{
            type:'file',
            name:opt.ajaxName,
            events:{
                'change':function(){
                    form.submit();
                    othis.listen(iframe,hiddenInput,wrap,tagIdInput);
                }
            }
        });

        wrap = new Element("div",{
            'data-mapid':mapId,
            styles:{
                width:70,
                height:70,
                marginRight:opt.marginRight,
                position:'relative',
                display:'inline-block',
                backgroundColor:"#efefef",
                color:"#ddd",
                border:'1px solid #ddd',
                textAlign:'center',
                fontSize:13,
                backgroundRepeat:'no-repeat',
                backgroundSize:'contain',
                backgroundPosition:'center'
            },
            html:"<span style='font-size:25px'>+</span><p style='margin-top:10px'>上傳圖片</p>",
            events:{
                'click':function(){
                    input.click();
                },
            },
        });

        form = new Element("form",{
            action:opt.uploadUrl,
            method:opt.method,
            target:iframeName,
            enctype:opt.enctype,
            'class':opt.className,
            styles:{
                display:"none"
            }
        });

        iframe = new Element("iframe",{
            name:iframeName,
            styles:{
                display:'none'
            }
        });

        tagIdInput = new Element("input",{
            name:opt.deleteTag,
            styles:{
                display:'none',
            }
        });

        //用于最后上傳的input
        hiddenInput = new Element("input",{
            type:'hidden',
            'data-index':1,
            id:mapId,
            name:opt.imageName,
        });

        if(othis.count > 1){
            var deleteIcon = new Element("span",{
                styles:{
                    position:"absolute",
                    right:-8,
                    top:-8,
                    borderRadius:'50%',
                    textAlign:'center',
                    lineHeight:18,
                    width:16,
                    height:16,
                    border:'1px solid #333',
                    backgroundColor:'#efefef',
                    color:'red',
                    cursor:'pointer',
                },
                html:'×',
                events:{
                    click:function(e){
                        e.stop();
                        if(opt.deleteUrl){
                            var data = opt.deleteTag+"="+hiddenInput.get("value");
                            new Request({
                                url:opt.deleteUrl,
                                'data':data,
                                method:opt.deleteMethod
                            }).send();
                        }
                        hiddenInput.dispose();
                        wrap.dispose();
                        othis.count --;
                    }
                }
            });
            wrap.adopt(deleteIcon);
        }

        form.adopt(input,iframe,tagIdInput);
        $$(document.body).adopt(form);

        othis.container.adopt(wrap,hiddenInput);
    },
});

后端php對(duì)應(yīng)的代碼:

#file upload.php
<?php
$file = $_FILES;
$f = $file['file'];
move_file_upload($f['tmp_name'],"test.jpg");
$id = uniqid();
echo "http://localhost/test.jpg;".$id;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尸疆,一起剝皮案震驚了整個(gè)濱河市椿猎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寿弱,老刑警劉巖犯眠,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異症革,居然都是意外死亡筐咧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)量蕊,“玉大人铺罢,你說(shuō)我怎么就攤上這事∥H冢” “怎么了畏铆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吉殃。 經(jīng)常有香客問(wèn)我辞居,道長(zhǎng),這世上最難降的妖魔是什么蛋勺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任瓦灶,我火速辦了婚禮,結(jié)果婚禮上抱完,老公的妹妹穿的比我還像新娘贼陶。我一直安慰自己,他們只是感情好巧娱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布碉怔。 她就那樣靜靜地躺著,像睡著了一般禁添。 火紅的嫁衣襯著肌膚如雪撮胧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天老翘,我揣著相機(jī)與錄音芹啥,去河邊找鬼。 笑死铺峭,一個(gè)胖子當(dāng)著我的面吹牛墓怀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卫键,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼傀履,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了莉炉?” 一聲冷哼從身側(cè)響起钓账,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呢袱,沒(méi)想到半個(gè)月后官扣,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羞福,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年惕蹄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卖陵,死狀恐怖遭顶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泪蔫,我是刑警寧澤棒旗,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站撩荣,受9級(jí)特大地震影響铣揉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜餐曹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一逛拱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧台猴,春花似錦朽合、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至休讳,卻和暖如春讲婚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衍腥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工磺樱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纳猫,地道東北人婆咸。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像芜辕,于是被迫代替她去往敵國(guó)和親尚骄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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