實(shí)現(xiàn)點(diǎn)擊下載文件的幾種方法


作者:李成文;
標(biāo)簽:文件下載,技巧


在實(shí)現(xiàn)點(diǎn)擊下載文件有多種方法:

后端設(shè)置header信息

通過(guò)后端告訴瀏覽器header信息實(shí)現(xiàn)下載:

header('Content-type: image/jpeg'); 
header("Content-Disposition: attachment; filename='download.jpg'"); 

局限:

  • 需要后端配合.

直接跳轉(zhuǎn)到目標(biāo)文件的地址

使用window.open()或者location.href或者直接使用<a>標(biāo)簽將頁(yè)面跳轉(zhuǎn)到文件地址,如果文件時(shí)瀏覽器無(wú)法打開(kāi)的文件類(lèi)型,瀏覽器會(huì)自動(dòng)下載該文件.

局限:

  • 會(huì)自動(dòng)打開(kāi)一個(gè)新頁(yè)面,體驗(yàn)不好.
  • 圖片文件和文本文件這些瀏覽器能夠打開(kāi)的文件無(wú)法下載.

使用表單提交的方式下載文件

實(shí)現(xiàn)的思路是: 在點(diǎn)擊之后,在頁(yè)面中通過(guò)js代碼新建一個(gè)form表單元素,然后通過(guò)提交表單的方式請(qǐng)求文件,如果文件類(lèi)型是時(shí)瀏覽器無(wú)法打開(kāi)的文件,那么就會(huì)對(duì)文件進(jìn)行下載.

function download2() {
    var $form = $('<form method="GET"></form>');
    $form.attr('action', '/download/papers/1');
    $form.appendTo($('body'));
    $form.submit();
}

優(yōu)點(diǎn):

  • 不需要開(kāi)啟新的頁(yè)面即可下載文件.

局限:

  • 無(wú)法下載瀏覽器能夠打開(kāi)的文件.

使用a標(biāo)簽的download屬性

通過(guò)在a標(biāo)簽中添加download屬性,即可實(shí)現(xiàn)點(diǎn)擊下載任何文件,體驗(yàn)非常的好.

局限:

  • 兼容性差,在大部分瀏覽中不支持跨域資源的download屬性下載.

使用file-saver插件實(shí)現(xiàn)文件下載

file-saver內(nèi)部操作:

  • 支持download的瀏覽器,直接使用a標(biāo)簽實(shí)現(xiàn)下載.

  • 不支持download的瀏覽器:

    • 特殊瀏覽器支持FileReader的,使用其構(gòu)建URL,使用window.open或location.href來(lái)實(shí)現(xiàn).
    • 除了特殊的瀏覽器,使用URL.createObjectURL來(lái)構(gòu)建對(duì)象URL,使用window.open或location.href來(lái)實(shí)現(xiàn).

使用:

handleDownload(url, name) {
    this.getBlob(url).then(blob => {
        saveAs(blob, name);
    })
    return false;
};
getBlob(url) {
    return new Promise(resolve => {
        const xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.responseType = 'blob';
        xhr.onload = () => {
            if (xhr.status === 200) {
            resolve(xhr.response);
            }
        };
        xhr.send();
    })
};

參考文檔

張?chǎng)涡癫┛完P(guān)于a標(biāo)簽download屬性的介紹
file-saver插件地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評(píng)論 18 139
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,588評(píng)論 1 45
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,813評(píng)論 25 708
  • mui summary picker 添加年插件問(wèn)題總結(jié) 1. 取消按鈕點(diǎn)擊事件無(wú)法獲取可以獲取到取消按鈕標(biāo)簽和確...
    來(lái)干了這碗疙瘩湯閱讀 1,314評(píng)論 0 0
  • 我怕死是真的,因?yàn)槲覐男【团滤肋@事,在我們整個(gè)家族里幾乎人人皆知,而且大家都知道我怕死那是天生的。這是因?yàn)樵谖液苄?..
    yangzinm閱讀 436評(píng)論 0 0