前言
在實作檔案下載時,我們通常會透過location.href() 、window.open()、iframe 等方式來下載檔案,
詳細實作方式可以參考黑暗執行緒的「透過Javascript觸發檔案下載」,
那為何不行透過 ajax 來下載檔案呢 ?
我們可以從以下兩個面向來探討「為何不能使用 ajax 來下載檔案」:
ajax
ajax 其中一項最重要的作用是「非同步處理」,即我們可以透過 ajax 發出 HttpRequest 向伺服器索取我們想要的資料,
且我們的畫面不需要為了取得部份的資料,而刷新整個頁面;
當然好處還很多,不過我想最重要的一點就是「跟伺服器要資料到前端來處理」,
所以我們去看jQuery 官方文件,可以看到 ajax 支援的回傳格式(dataType) 有 xml, json , script 或是 html,
可以發現全部都是屬於「文字」型態的格式,也就是說ajax 本身就不是設計來下載檔案使用的。
JavaScript
假設我們真的可以取得檔案資料(binary) ,但也不可能直接透過JavaScript 將檔案存在我們本機端,
原因是因為,只要有心人士對我們的網頁植入惡意Script ,他就能瘋狂地幫我們下載檔案,這樣不是很恐怖嗎?
換句話說,瀏覽器會阻止JavaScript 直接「存取」本機端的資源,以避免遭受惡意攻擊。
以上是「為何不能使用 ajax 來下載檔案」的原因。常常我們在寫程式時都「知其然,而不知所以然」,
有時這些小細節卻會演變成大問題,提醒自己也提醒大家。
參考:
http://stackoverflow.com/questions/14682556/why-threre-is-no-way-to-download-file-using-ajax-request
-
Previous
[Asp.Net MVC] MVC 網站部署失敗 -
Next
[Asp.Net MVC] An item with the same key has already been added!