跨域上傳圖片并預(yù)覽

跨域上傳文件

之前解決跨域問題都是使用的JQuery的JSONP類型的Ajax請(qǐng)求霎箍,JSONP原理是讓服務(wù)器把數(shù)據(jù)放到它動(dòng)態(tài)生成的JS文件中,然后在客戶端中調(diào)用舱权。但是JSONP只支持GET方式的請(qǐng)求逾冬,不適用于上傳文件包吝。

所以后來使用CORS實(shí)現(xiàn)跨域上傳文件锥余。CORS允許遠(yuǎn)程服務(wù)器定義哪些源站有權(quán)限訪問它的資源腹纳。具體做法是在服務(wù)器端設(shè)置響應(yīng)頭部的Access-Control-Allow-Origin。設(shè)置為*表示允許任意外域訪問驱犹,也可以指定允許某個(gè)源站的地址嘲恍,比如Access-Control-Allow-Origin: http://test.example

FormData處理文件數(shù)據(jù)

當(dāng)表單中需要上傳文件時(shí)雄驹,可以使用FormData佃牛,這時(shí)需要在form標(biāo)簽中指定編碼類型為multipart/form-data。對(duì)應(yīng)的HTML代碼:

<form name="editUserForm" enctype="multipart/form-data">
    <input id="imageUpload" type="file" accept='image/jpg,image/jpeg,image/png,image/svg' class="btn btn-primary" >
</form>

FormData使用也很簡(jiǎn)單医舆,結(jié)合JQuery的POST類型的Ajax請(qǐng)求傳遞數(shù)據(jù)俘侠。對(duì)應(yīng)的js代碼:

var formdata = new FormData();
formdata.append('photo', $("#imageUpload")[0].files[0]);
//也可以添加別的數(shù)據(jù)...

//發(fā)送請(qǐng)求
$.ajax({
    type: 'POST',
    url: "/api/user/update/",
    data: formdata,     //用FormData編碼好的數(shù)據(jù)
    cache: false,           //不緩存
    contentType: false,     //禁止jQuery的數(shù)據(jù)轉(zhuǎn)換操作(data默認(rèn)轉(zhuǎn)換為query string)
    processData: false,     //禁止jQuery默認(rèn)的轉(zhuǎn)換過程
    error: function() {
        console.log('request /api/user/update/ failed!');
    },
    success: function(data) {
        //......
    }
})

需要注意的是,

FormData對(duì)象的字段類型可以是 Blob, File, 或者 string: 如果它的字段類型不是Blob也不是File彬向,則會(huì)被轉(zhuǎn)換成字符串類型兼贡。

比如我遇到一個(gè)問題就是攻冷,如果字段的值為null娃胆,傳遞到后端的會(huì)是字符串"null",導(dǎo)致保存到數(shù)據(jù)庫里對(duì)應(yīng)的字段內(nèi)容也變成字符串"null"了等曼,這是個(gè)坑里烦。

FileReader讀取文件并預(yù)覽

如果選擇圖片之后要在當(dāng)前頁面上預(yù)覽,可以使用HTML5的FileReader實(shí)現(xiàn)禁谦。這里主要使用readAsDataURL(file)方法胁黑,讀取文件并將文件以數(shù)據(jù)URI的形式保存在result屬性中,然后在加載文件的事件監(jiān)聽中將result設(shè)置為圖片的src州泊,這樣就能在頁面上看到剛選擇的圖片了丧蘸。

對(duì)應(yīng)的JS代碼:

//上傳照片按鈕的change事件監(jiān)聽,實(shí)現(xiàn)照片預(yù)覽
$("#imageUpload").on('change', function () {
    if($(this)[0].files[0].size/(1000) >256){    //限制文件的大小
        $.dialog({
            title: "哎呀",
            content: "上傳的照片應(yīng)小于256KB遥皂!"
        });
    }else{
        if (typeof (FileReader) != "undefined") {
            var image_holder = $("#image-holder");
            image_holder.empty();
            
            var reader = new FileReader();
            reader.onload = function (e) {  //FileReader的load事件監(jiān)聽
                $("<img />", {
                    "src": e.target.result,
                    "class": "thumb-image"
                }).appendTo(image_holder);
            };
            image_holder.show();
            reader.readAsDataURL($(this)[0].files[0]);  //使用FileReader讀取文件
        } else {
            $.dialog({
                title: "哎呀",
                content: "您的瀏覽器不支持FileReader力喷!"
            });
        }
    } 
});

file類型的input點(diǎn)擊后彈窗很慢?

使用Chrome演训,點(diǎn)擊選擇文件按鈕之后弟孟,等好幾秒彈窗才出現(xiàn),甚至瀏覽器直接卡死了样悟。后來發(fā)現(xiàn)是因?yàn)樵O(shè)置了accept='image/*'拂募,解決辦法是指定具體的幾種圖片格式庭猩。比如accept='image/jpg, image/jpeg, image/png, image/svg'

參考鏈接

通過HTML5 FileReader實(shí)現(xiàn)上傳圖片預(yù)覽功能
FormData對(duì)象的使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陈症,一起剝皮案震驚了整個(gè)濱河市蔼水,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爬凑,老刑警劉巖徙缴,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嘁信,居然都是意外死亡于样,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門潘靖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穿剖,“玉大人,你說我怎么就攤上這事卦溢『啵” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵单寂,是天一觀的道長(zhǎng)贬芥。 經(jīng)常有香客問我,道長(zhǎng)宣决,這世上最難降的妖魔是什么蘸劈? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮尊沸,結(jié)果婚禮上威沫,老公的妹妹穿的比我還像新娘。我一直安慰自己洼专,他們只是感情好棒掠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屁商,像睡著了一般烟很。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜡镶,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天雾袱,我揣著相機(jī)與錄音,去河邊找鬼帽哑。 笑死谜酒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妻枕。 我是一名探鬼主播僻族,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粘驰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了述么?” 一聲冷哼從身側(cè)響起蝌数,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎度秘,沒想到半個(gè)月后顶伞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剑梳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年唆貌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垢乙。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锨咙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出追逮,到底是詐尸還是另有隱情酪刀,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布钮孵,位于F島的核電站骂倘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏巴席。R本人自食惡果不足惜历涝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望情妖。 院中可真熱鬧睬关,春花似錦诱担、人聲如沸毡证。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽料睛。三九已至,卻和暖如春摇邦,著一層夾襖步出監(jiān)牢的瞬間恤煞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工施籍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留居扒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓丑慎,卻偏偏與公主長(zhǎng)得像喜喂,于是被迫代替她去往敵國和親瓤摧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理玉吁,服務(wù)發(fā)現(xiàn)照弥,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,764評(píng)論 0 15
  • 參考1-HTML5實(shí)現(xiàn)圖片壓縮上傳功能參考2-移動(dòng)前端—圖片壓縮上傳實(shí)踐參考3-移動(dòng)端H5圖片壓縮上傳 大體步驟 ...
    不要變成發(fā)抖的小喵喵喵喵喵喵閱讀 3,817評(píng)論 0 15
  • 基于官方文檔的翻譯进副,官方文檔 file_browser_callback這個(gè)選項(xiàng)允許你添加自己的文件或者圖片瀏覽器...
    Keriy閱讀 22,310評(píng)論 2 9
  • 今天老師詳細(xì)講解了指針的用法这揣,包括指針的意義,指針數(shù)組影斑,行指針等概念给赞。還是比較容易理解的,但是用起來就不那么自如了...
    王子龍同學(xué)閱讀 574評(píng)論 1 49