<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        談談基于iframe、FormData、FileReader三種無刷新上傳文件的方法_javascript技巧

        來源:懂視網 責編:小采 時間:2020-11-27 21:46:39
        文檔

        談談基于iframe、FormData、FileReader三種無刷新上傳文件的方法_javascript技巧

        談談基于iframe、FormData、FileReader三種無刷新上傳文件的方法_javascript技巧:發請求有兩種方式,一種是用ajax,另一種是用form提交,默認的form提交如果不做處理的話,會使頁面重定向。以一個簡單的demo做說明: html如下所示,請求的路徑action為upload,其它的不做任何處理: 服務端(node)response直接返
        推薦度:
        導讀談談基于iframe、FormData、FileReader三種無刷新上傳文件的方法_javascript技巧:發請求有兩種方式,一種是用ajax,另一種是用form提交,默認的form提交如果不做處理的話,會使頁面重定向。以一個簡單的demo做說明: html如下所示,請求的路徑action為upload,其它的不做任何處理: 服務端(node)response直接返
        發請求有兩種方式,一種是用ajax,另一種是用form提交,默認的form提交如果不做處理的話,會使頁面重定向。以一個簡單的demo做說明:


        html如下所示,請求的路徑action為"upload",其它的不做任何處理:

        服務端(node)response直接返回: "Recieved form data",演示如下:

        可以看到默認情況下,form請求upload的同時重定向到upload。但是很多情況下是希望form請求像ajax一樣,不會重定向或者刷新頁面。像上面的場景,當上傳完成之后,將用戶選擇的頭像顯示在當前頁面。

        解決辦法第一種是使用html5的FormData,將form里面的數據封裝到FormData對象里,然后再以POST的方式send出去。如下面代碼所示,對提交按鈕的單擊事件做一個響應,代碼第6行獲取到form的DOM對象,然后第8行構造一個FormData的實例,第18行,將form數據發送出去。

        上傳成功后,服務將返回圖片的訪問地址,補充14行對請求成功的處理:在submit按鈕的上方位置顯示上傳的圖片:

        示例:


        如果使用jQuery,可以把formData作為ajax的data參數,同時設置contentType: false和processData: false,告訴jQuery不要去處理請求頭和發送的數據。

        看起來這種提交方式跟ajax一樣,但是其實并不是完全一樣,form提交的數據格式有三種,如果要上傳文件則必須為multipart/form-data,所以上面的form提交請求里的http的頭信息里面的Content-Type為multipart/form-data,而普通的ajax提交為application/json。form提交完整的Content-Type如下:

        "content-type":"multipart/form-data; boundary=------WebKitFormBoundaryYOE7pWLqdFYSeBFj"

        除了multipart/form-data之外,還指定了boundary,這個boundary的作用是用來區分不同的字段。由于FormData對象是不透明的,調用JSON.stringify將會返回一個空的對象{},同時FormData只提供append方法,所以無法得到FormData實際上傳的內容,但是可以通過分析工具或者服務收到的數據進行查看。在上面如果上傳一個文本文件,那么服務收到的POST數據的原始格式是這樣的:

        ------WebKitFormBoundaryYOE7pWLqdFYSeBFj

        Content-Disposition: form-data; name="user"

        abc

        ------WebKitFormBoundaryYOE7pWLqdFYSeBFj

        Content-Disposition: form-data; name="file"; filename="test.txt"
        Content-Type: text/plain

        這是一個文本文件的內容。

        ------WebKitFormBoundaryYOE7pWLqdFYSeBFj--

        從上面服務收到的數據看出FormData提交的格式,每個字段以boundary隔開,最后以--結束。而ajax請求,send出去的數據格式是自定義的,一般都是以key=value中間用&連接:

        服務就會收到和send發出去的字符串一模一樣的內容,然后再作參數解析,所以就得統一參數的格式:

        user=abc&file=這是一個文本文件的內容

        從這里可以看出POST本質上并不比GET安全,POST只是沒有將數據放在網址傳送而已。

        考慮到FormData到了IE10才支持,如果要支持較低版本的IE,那么可以借助iframe。

        文中一開始就說,默認的form提交會使頁面重定向,而重定向的規則在target中指定,可以和a標簽一樣指定為"_blank",在新窗口中打開;還可以指定為一個iframe,在該iframe中打開。所以可以弄一個隱藏的iframe,將form的target指向這個iframe,當form請求完成時,返回的數據就會由這個iframe顯示,正如上面在新頁面顯示的:"Recieved form data"。請求完成后,iframe加載完成,觸發load事件,在load事件的處理函數里,獲取該iframe的內容,從而拿到服務返回的數據了!拿到后再把iframe刪掉。

        在提交按鈕的響應函數里,首先創建一個iframe,設置iframe為不可見,然后再添加到文檔里:

        改變form的target為iframe的name值:

        然后再響應iframe的load事件:

        第二種辦法到這里就基本可以了,但是如果看163郵箱或者QQ郵箱上傳文件的方式,會發現和上面的兩種方法都不太一樣。用httpfox抓取請求的數據,會發現上傳的內容的格式并不是上面說的用boundary隔開,而是直接把文件的內容POST出去了,而文件名、文件大小等相關信息放在了文件的頭部。如163郵箱:

        POST Data:

        this is a text

        Headers:

        Mail-Upload-name: content.txt
        Mail-Upload-size: 15

        可以推測它們應該是直接讀取了input文件的內容,然后直接POST出去了。要實現這樣的功能,可以借助FileReader,讀取input文件的內容,再保留二進制的格式發送出去:

        代碼第13行執行讀文件,讀取完畢后觸發第6行的load響應函數,第7行以二進制文本形式發送出去。由于sendAsBinary的支持性不是很好,可以自行實現一個:

        代碼的關鍵在于第6行,將字符串轉成8位無符號整型,還原二進制文件的內容。在執行了fr.readAsBinaryString之后,二進制文件的內容將會以utf-8的編碼以字符串形式存放到result,上面的第6行代碼將每個unicode編碼轉成整型(&0xff或者parseInt),存放到一個8位無符號整型數組里面,第8行把這個數組發送出去。如果直接send,而不是sendAsBinary,服務收到的數據將無法正常還原成原本的文件。

        上面的實現需要考慮文件太大,需分段上傳的問題。

        關于FileReader的支持性,IE10以上支持,IE9有另外一套File API。

        文章討論了3種辦法實現無刷新上傳文件,分別是使用iframe、FormData和FileReader,支持性最好是的iframe,但是從體驗的效果來看FormData和FileReader更好,因為這兩者不用生成一個無用的DOM再刪除,其中FormData最簡單,而FileReader更加靈活。

        下面給大家介紹iframe無刷新上傳文件

        標簽相比多了一個target屬性罷了,用于指定標簽頁在哪里打開以及提交數據。

        如果沒有設置該屬性,就會像平常一樣在本頁重定向打開action中的url。

        而如果設置為iframe的name值,即"upload"的話,就會在該iframe內打開,因為CSS設置為隱藏,因而不會有任何動靜。若將display:none去掉,還會看到服務器的返回信息。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        談談基于iframe、FormData、FileReader三種無刷新上傳文件的方法_javascript技巧

        談談基于iframe、FormData、FileReader三種無刷新上傳文件的方法_javascript技巧:發請求有兩種方式,一種是用ajax,另一種是用form提交,默認的form提交如果不做處理的話,會使頁面重定向。以一個簡單的demo做說明: html如下所示,請求的路徑action為upload,其它的不做任何處理: 服務端(node)response直接返
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲人成色77777在线观看大| 成熟女人特级毛片www免费| 免费乱码中文字幕网站| 亚洲精品天堂成人片AV在线播放| 97在线线免费观看视频在线观看| 97久久精品亚洲中文字幕无码| 久久国产乱子伦精品免费看| 久久国产亚洲高清观看| 免费可以看黄的视频s色| 亚洲AV无码久久久久网站蜜桃| 97免费人妻无码视频| 亚洲日产乱码一二三区别| 日韩人妻无码免费视频一区二区三区 | 亚洲av无码成人精品区| 色婷婷精品免费视频| 亚洲?V无码成人精品区日韩 | 亚洲精品宾馆在线精品酒店| 午夜男人一级毛片免费| 另类专区另类专区亚洲| 亚洲日本va中文字幕久久| 精品无码国产污污污免费网站 | 亚洲综合精品一二三区在线| 亚洲视频免费播放| 亚洲日本VA午夜在线影院| 国产成人无码免费视频97| A毛片毛片看免费| 亚洲视频在线观看网址| 免费观看的毛片手机视频| 永久免费无码日韩视频| 亚洲黄网站wwwwww| 日韩电影免费在线| a级在线免费观看| 亚洲熟女精品中文字幕| 亚洲精品自在在线观看| 最新中文字幕电影免费观看| 国产精品免费αv视频| 亚洲嫩草影院在线观看| 亚洲男人的天堂一区二区| 久久久免费精品re6| 国产青草亚洲香蕉精品久久| 亚洲AV无码乱码国产麻豆|