<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
有時候會遇到非同步介面會返回一個 url 地址,然後前端需要根據這個 url 地址去下載檔案資源的需求場景。 而這個 url 其實是一個靜態資源地址,並非一個經過後端介面內部處理的介面地址。 所以當嘗試像下面這樣使用 a 標籤去執行該 url 地址,會發現它是直接預覽開啟的一個 json 檔案(也可能是一個txt,js等檔案)
<a href=" http://192.168.0.172:8888/file/package.json" rel="external nofollow" download="package.json">下載json</a>
在瀏覽器視窗直接開啟該 url ,會發現它也是直接開啟了這個 json 檔案。txt,js,css 等可存取的靜態資源地址也會被直接開啟(這或許叫預覽,兩種形式,一種是預覽檔案,另一種是下載檔案)而不是下載。 這和資源地址返回的方式(responseType)有關, 預設返回的可能是位元組流或字元流的形式,而這種返回形式能被瀏覽器識別預覽,於是就直接開啟了(執行了預覽檔案模式)。 我們更常見的可能是圖片,它可以直接在瀏覽器開啟預覽,這大概率也是因為其返回的形式是 base64 的圖片, 它能被瀏覽器識別,於是就瀏覽器就正常執行了檔案預覽模式,而非下載模式。
例如,同樣位置的靜態資源,一個是 json,一個是 .zip 壓縮檔案。兩個 url,你會發現在瀏覽器視窗執行 json 檔案的 url, 瀏覽器執行的是預覽模式,直接開啟了檔案。而在瀏覽器視窗輸入 .zip 壓縮檔案的 url,瀏覽器並沒有執行預覽模式, 而是執行了下載模式,直接下載檔案了。
下面是兩個測試的示意圖
那麼,如果想根據這種介面返回的 url(一個靜態資源地址,例如 一個 json 或 txt 檔案的資源地址), 直接下載而不是預覽該如何做呢?
處理方案關鍵詞:非同步下載,設定 responseType = 'blob'。
1.設定請求的返回方式為 responseType = 'blob',如果不設定可能會導致下載後無法正常開啟。
2.設定請求地址,請求方式,以及必要的請求頭引數等,例如 token 等,可按需設定。
3.將返回的位元組流(字元流)轉換為 blob 物件
const blob = new Blob([res.data]) // 將位元組流(字元流)轉換為 blob 物件
4.為該 blob 在建立一個資源 url
let url = window.URL.createObjectURL(blob)
5.使用該 url 建立一個 a 標籤,模擬點選事件執行下載
這一步,和我們平常使用的同步下載資原始檔方式一致。下載後需注意釋放掉 blob 物件的 ObjectURL。
let link = document.createElement('a') link.style.display = 'none' link.href = url link.download = filename document.body.appendChild(link) link.click() document.body.removeChild(link) // 下載完成移除元素 window.URL.revokeObjectURL(url) // 釋放掉blob物件
tips:ie 並不支援直接下載 blob 資源,可以利用 window.navigator.msSaveOrOpenBlob(blob, filename) 解決這個問題。
// 解決 ie 不支援下載 blob資源 if ('msSaveOrOpenBlob' in navigator) { window.navigator.msSaveOrOpenBlob(blob, filename) return }
上述程式碼在 ie 執行會自動開啟一個詢問視窗,該視窗會問你是下載還是預覽,選擇下載就可以正常下載了。
下面是一個在 ie 執行下載 blob 後的截圖
<template> <div> <h1 @click="xhrDownload"> xhr 非同步下載 json 等資原始檔</h1> <h1 @click="axiosDownload">axios 非同步下載 json 等資原始檔</h1> </div> </template> <script> import axios from 'axios' export default { name: 'DownloadFile', methods: { axiosDownload () { // config 是設定物件,可按需設定,例如 responseType,headers 中設定 token 等 const config = {} // 這一步可能很關鍵,特別是在能下載,但是下載下來開啟異常的時候。 config.responseType = 'blob' axios.get('http://localhost:8278/package.json', config).then(res => { const blob = new Blob([res.data]) // 將位元組流(字元流)轉換為 blob 物件 this.blobDownload(blob) }) }, /** * 下載檔案:下載 blob 物件形式的檔案 * @param blob * @param filename */ blobDownload (blob, filename = '檔案.json') { let url = window.URL.createObjectURL(blob) // 解決 ie 不支援下載 blob資源 if ('msSaveOrOpenBlob' in navigator) { window.navigator.msSaveOrOpenBlob(blob, filename) return } let link = document.createElement('a') link.style.display = 'none' link.href = url link.download = filename document.body.appendChild(link) link.click() document.body.removeChild(link) // 下載完成移除元素 window.URL.revokeObjectURL(url) // 釋放掉blob物件 }, xhrDownload (params) { // token 等header 引數和 請求方式都可以按需設定 const token = localStorage.getItem('token') || '' const url = 'http://localhost:8278/package.json' let xhr = new XMLHttpRequest() // get 方式 xhr.open('get', url + '?timeStamp=' + new Date().getTime(), true) xhr.setRequestHeader('Cache-Control', 'no-cache') xhr.setRequestHeader('Content-type', 'application/json') // xhr.setRequestHeader('kms-token', token) // 返回型別blob,不設定會打不開 excel xhr.responseType = 'blob' // 定義請求完成的處理常式,請求前也可以增載入入框/禁用下載按鈕邏輯 xhr.onload = function () { // 請求完成 if (this.status === 200) { let blob = this.response let url = window.URL.createObjectURL(blob) // 生成 url,建立一個a標籤用於下載 let a = document.createElement('a') a.download = '收支清單.json' a.href = url a.click() } } xhr.send(JSON.stringify(params)) } } } </script>
到此這篇關於如何根據後端返回的url下載json檔案的文章就介紹到這了,更多相關後端返回url下載json檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45