Ajax/Axios/Fetch 自動彈出下載文件,最優解研究

通過JS調用axios和fetch下載文件,但卻不會自動彈出下載。想讓瀏覽器自動彈出下載,卻要額外做些工作。

但發現網絡上絕大多數的解決方案,都是動態創建一個<a href=xxx>鏈接,然後自動點擊,最後再動態刪除a節點。一直覺得這種方式很繁瑣,顯然這不是我想要的解決方案。

繼續研究,發現中間核心的代碼主要是兩個地方:

一是const blob = response.blob(),即是把返回數據轉換爲blob格式;

二是URL.createObjectURL(blob),即是將這個blob數據封裝成一個新的地址。

於是有了靈感,爲何不直接跳轉到這個URL呢??

const blob = response.blob();

location.href = URL.createObjectURL(blob);

成功!!!

我同時也搜到,在stackoverflow論壇已經有國外技術這麼用了,但他的使用的是location.assign(blob)。結合整理下,完整代碼爲:

fetch(uri, {
    baseURL: 'http://localhost:8080',
    method: 'GET',
    credentials: 'include',
    mode: 'cors',
    headers: {
        Authentication: token
    },
}).then(res => res.blob()).then(res => {
    const file = URL.createObjectURL(res);
    location.assign(file);
}).catch(err => console.log(err));

但是發現個問題,文件名是隨機的,並不是原始文件名。

折騰了半天,發現並沒有解決方法。

如果需要下載時保留原始文件名,仍舊需要採用創建a標籤的方式。

但依然可以簡化:並不需要在html節點中添加然後再刪除,直接創建a節點對象即可:

const objUrl = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = objUrl;
a.download = filename;
a.click();

如有更簡潔的方案,歡迎留言!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值