首頁 web前端 js教程 使用Blod做出ajax的進度條下載

使用Blod做出ajax的進度條下載

Apr 02, 2018 pm 02:08 PM
ajax 進度

這次帶給大家使用Blod做出ajax的進度條下載,使用Blod做出ajax的進度條下載的注意事項有哪些,下面就是實戰案例,一起來看一下。

普通的瀏覽器下載

在web開發中,如果要實作下載功能,往往都是使用新開web頁面或是使用iframe的形式。實現起來其實很簡單:

<a target="_blank" href="download.zip" rel="external nofollow" >点击下载</a>
//或者
<iframe style="display:none" src="download.zip"></iframe>
登入後複製

用戶點擊a標籤彈出一個新頁籤後,或者是打開了iframe後,瀏覽器就會接受一個下載響應,並下載附件。其實所謂附件下載,就是瀏覽器讀到回應封包的頭之後,瀏覽器產生一個下載提示框,在使用者確定後會繼續下載檔案。文件其實就是個流,所謂流就是一個傳輸的過程,瀏覽器會自動管理這個傳輸過程,會自動生成進度條、停止下載按鈕、繼續繼續按鈕、取消下載按、顯示更新下載的字節數鈕等。這些都是瀏覽器自動為我們做的,整個過程不受我們控制。

ajax下載

瀏覽器對下載的支援基本上已經能滿足我們的需求,並在一般場景中探索其他下載方式意義不大。但還是有些場景是瀏覽器下載不能滿足的,例如要求我們的web應用程式對下載進度的進行監控,或者下載完成後觸發特定事件,或者web應用可以自動取消下載過程,或者使用worker創建一個後台運行的下載等等。對於以上情況我們都可以採用基於Blod物件的ajax下載。

ajax下載附件和ajax上傳附件一樣,需要瀏覽器支援ajax2.0。其實所謂下載和和普通的ajax請求沒什麼區別,都是對一個url地址做請求,但是下載一般都是二進位文件,不是文本對像或者json對象,需要JavaScript提供一個對夠封裝這個二進位檔案的類型,這就是blod。因此要設定回應的類型responseType的值為「blod」:

var xhr =new XMLHttpRequest();
xhr.open(option.type ? option.type.toUpperCase() : 'GET', url, true);
xhr.responseType = 'blob';
登入後複製

要求XMLHttpRequest物件的responseType欄位值是blob。那麼blod物件又是什麼呢?

blod物件

MDN對其描述為:

Blob物件是包含有唯讀原始資料的類別檔案物件。 Blob物件中的資料不一定得是JavaScript 中的原生形式。 File介面基於 Blob,繼承了Blob的功能,並且擴充支援使用者電腦上的本機檔案。透過Blob物件我們可以將一個二進位流封裝為一個物件。

如果你了解過html5的file相關的api,你對於blod物件應該不會是陌生。 blod能夠把一個位元組流封裝為一個文件,將XMLHttpRequest物件的responseType值是blob,我們可以把回應體當做是一個blob物件處理。

xhr.onload = function () {
  //对于重定向的文件不予理会
  if (this.status >= 200 && this.status < 300) {
    var blob = new Blob([this.response], {type: this.response.type});
  }
}
登入後複製

使用ajax下載文件,再將文件儲存為blob對象,快取在瀏覽器中。那麼如何讓使用者將檔案儲存到硬碟上呢?

將blob物件保存在硬碟上

我們可以效仿瀏覽器下載,產生一個a標籤或iframe,再產生一個url,這樣就回到了瀏覽器下載了,瀏覽器會自動產生一個儲存附件的視窗。 url可以使用URL.createObjectURL(blob)方法取得,URL.createObjectURL支援Blob對象和File對象,能夠產生一個虛擬的url使當前用戶可以存取到這些對象,當然也包括下載。有別於直接從伺服器下載,這裡的下載是客戶端內部的,不走網路io,所以下載幾乎是瞬時的。不過生成完這個url後,還要將其釋放,否則blob資源不會被垃圾回收,使用URL.revokeObjectURL就可以釋放掉這個url,讓blob資源釋放。對於ie瀏覽器,有自己的一套Blob物件處理策略,就是msSaveOrOpenBlob和msSaveBlob兩個navigator方法。

//ie的下载
if (window.navigator.msSaveOrOpenBlob) {
  navigator.msSaveBlob(blob, fileName);
} else {
  //非ie的下载
  var link = document.createElement('a');
  link.href = window.URL.createObjectURL(blob);
  link.download = fileName;
  link.click();
  window.URL.revokeObjectURL(link.href);
}
登入後複製

進度條和取消下載

然後就是進度條和下載取消功能了,其實XMLHttpRequest物件是有個progress事件的,只是我們平常做ajax請求的時候都忽略他,畢竟一般請求都是瞬時的,不需要為其設定進度條。但ajax下載卻不一樣,下載附件是需要時間的,因此為其開發個進度條還是很有必要的,監聽progress事件,我們就可以獲得下載進度。

使用XMLHttpRequest物件的abort函數可以取消下載,此外load事件可以監聽到下載完成,error事件可以監聽到下載失敗。總之,ajax下載和一個普通的ajax請求的事件和方法是完全一樣的。

效能最佳化和同源策略

ajax下載和長連線一樣,會比一般要求佔用更多頻寬,尤其是下載對頻寬佔用更是嚴重。因此下載過程中可能會阻塞其他的ajax請求,所以建議ajax下載的資源和其他請求的資源使用不同的域名,但是這樣又會帶來新的問題——同源策略問題。

同源策略是瀏覽器安全的基石,如果沒有同源策略隨便一個網站都可以發出csrf攻擊。如果無法保證下載的資源的url和目前頁面的url同源,就會觸發同源策略導致下載失敗,因此需要做ajax跨域處理。比起iframe和新頁籤的下載方法(事實上iframe也有同源策略,要求iframe裡面的頁面和父親頁面不能訪問對方的內容,但是下載功能不涉及這種訪問對方的內容操作,所以iframe下載是不受同源策略影響的),ajax下載本質上還是ajax,因此會受到瀏覽器同源策略的影響。所以如果下載非同源的附件,就需要附件所在的伺服器支援cors,如果伺服器需要存取cookie,也要將XMLHttpRequest物件的withCredentials設為true。

同時出於同源策略的原因,我們不能使用ajax的形式去下載第三方資源,因為通常的下載服務都不會做cors處理的,比竟iframe下載或者新頁簽下載的方式是不受同源策略影響的,所以無需做cors處理。這大大限制了ajax下載的適用度。

總結:

最後我們再總結一下ajax下載的使用場景:

1.需求對下載進度的進行監控的場景,例如發現用戶下載進進出出緩慢,主動提供其他解決方案。

2.需要下載完成後觸發特定事件,例如彈出一個桌面提示Notification。

3.需要提供一個後台下​​載。例如我們可以在用戶打開網頁後將附件偷偷地下載下來再緩存起來,等到用戶真的想下載附件時候直接保存在本地。我們甚至可以藉助worker創建一個後台線程,從而也能確保下載過程不會影響頁面正常渲染。

4.需要下載後不儲存在硬碟中,而是webapp直接處理附件。例如pdf.js,就是採用的ajax下載。

最後奉上筆者的一個ajax下載的demo:ajaxDownloadDemo_jb51.rar

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

C與View怎麼進行資料交流

#前端與後端有哪幾種ajax互動方法

以上是使用Blod做出ajax的進度條下載的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
PHP 與 Ajax:建立一個自動完成建議引擎 PHP 與 Ajax:建立一個自動完成建議引擎 Jun 02, 2024 pm 08:39 PM

使用PHP和Ajax建置自動完成建議引擎:伺服器端腳本:處理Ajax請求並傳回建議(autocomplete.php)。客戶端腳本:發送Ajax請求並顯示建議(autocomplete.js)。實戰案例:在HTML頁面中包含腳本並指定search-input元素識別碼。

解決jQuery AJAX請求遇到403錯誤的方法 解決jQuery AJAX請求遇到403錯誤的方法 Feb 20, 2024 am 10:07 AM

標題:解決jQueryAJAX請求出現403錯誤的方法及程式碼範例403錯誤是指伺服器禁止存取資源的請求,通常會導致出現這個錯誤的原因是請求缺少權限或被伺服器拒絕。在進行jQueryAJAX請求時,有時會遇到這種情況,本文將介紹如何解決這個問題,並提供程式碼範例。解決方法:檢查權限:首先要確保請求的URL位址是正確的,同時驗證是否有足夠的權限來存取該資

解決jQuery AJAX請求403錯誤的方法 解決jQuery AJAX請求403錯誤的方法 Feb 19, 2024 pm 05:55 PM

jQuery是一個受歡迎的JavaScript函式庫,用來簡化客戶端端的開發。而AJAX則是在不重新載入整個網頁的情況下,透過發送非同步請求和與伺服器互動的技術。然而在使用jQuery進行AJAX請求時,有時會遇到403錯誤。 403錯誤通常是伺服器禁止存取的錯誤,可能是由於安全性原則或權限問題導致的。在本文中,我們將討論如何解決jQueryAJAX請求遭遇403錯誤

如何解決jQuery AJAX報錯403的問題? 如何解決jQuery AJAX報錯403的問題? Feb 23, 2024 pm 04:27 PM

如何解決jQueryAJAX報錯403的問題?在開發網頁應用程式時,經常會使用jQuery來發送非同步請求。然而,有時在使用jQueryAJAX時可能會遇到錯誤代碼403,表示伺服器禁止存取。這種情況通常是由伺服器端的安全性設定所導致的,但可以透過一些方法來解決這個問題。本文將介紹如何解決jQueryAJAX報錯403的問題,並提供具體的程式碼範例。一、使

如何使用Ajax從PHP方法取得變數? 如何使用Ajax從PHP方法取得變數? Mar 09, 2024 pm 05:36 PM

使用Ajax從PHP方法取得變數是Web開發中常見的場景,透過Ajax可以實作頁面無需刷新即可動態取得資料。在本文中,將介紹如何使用Ajax從PHP方法中取得變量,並提供具體的程式碼範例。首先,我們需要寫一個PHP檔案來處理Ajax請求,並傳回所需的變數。下面是一個簡單的PHP檔案getData.php的範例程式碼:

PHP 與 Ajax:建立動態載入內容的解決方案 PHP 與 Ajax:建立動態載入內容的解決方案 Jun 06, 2024 pm 01:12 PM

Ajax(非同步JavaScript和XML)允許在不重新載入頁面情況下新增動態內容。使用PHP和Ajax,您可以動態載入產品清單:HTML建立一個帶有容器元素的頁面,Ajax請求載入資料後將資料加入到該元素中。 JavaScript使用Ajax透過XMLHttpRequest向伺服器傳送請求,從伺服器取得JSON格式的產品資料。 PHP使用MySQL從資料庫查詢產品數據,並將其編碼為JSON格式。 JavaScript解析JSON數據,並將其顯示在頁面容器中。點選按鈕觸發Ajax請求,載入產品清單。

PHP 與 Ajax:提升 Ajax 安全性的方法 PHP 與 Ajax:提升 Ajax 安全性的方法 Jun 01, 2024 am 09:34 AM

為了提升Ajax安全性,有幾種方法:CSRF保護:產生令牌並將其傳送到客戶端,在請求中新增至伺服器端進行驗證。 XSS保護:使用htmlspecialchars()過濾輸入,防止惡意腳本注入。 Content-Security-Policy頭:限制惡意資源加載,指定允許載入腳本和樣式表的來源。驗證伺服器端輸入:驗證從Ajax請求接收的輸入,防止攻擊者利用輸入漏洞。使用安全Ajax函式庫:利用jQuery等函式庫提供的自動CSRF保護模組。

ajax版本有哪些 ajax版本有哪些 Nov 22, 2023 pm 02:00 PM

ajax不是一個特定的版本,而是一種使用多種技術的集合來非同步載入和更新網頁內容的技術。 ajax沒有特定的版本號,但是有一些ajax的變體或擴充:1、jQuery AJAX;2、Axios;3、Fetch API;4、JSONP;5、XMLHttpRequest Level 2;6、WebSockets;7、Server-Sent Events;8、GraphQL等等。

See all articles