js下載檔案,並捕獲異常的記錄
在伺服器返回ResponseEntity<byte[]>這種二進位制流的情況下,對於異常的捕獲封裝返回的卻仍然是json,今天折騰了很久
總結如下:
該介面返回值為ResponseEntity<byte[]>,有異常攔截@[email protected],當在下載檔案時出現了異常,則不會返回二進位制流,而返回異常攔截定義的返回值,在此假設為{code:200,messege:"e"},HttpStatus=500。
前端使用fetch請求的程式碼如下:
fetch(url,{options})
//以前沒有先行判斷res.status,後來發現不判斷會很麻煩,因為按照後端習慣來說,全部返回200,然後封裝結果集也是可以完成任務的;後來像今天這種情景讓我知道了果然不按照標準走,解決方案會tm多敲很多字吶。
.then(function(res){
if(res.status==200){return res;}
const error=new Error(res.statusText);
error.response=res;
})
.then(function(res){
//下載檔案這一套,檔名按照習慣來說是封裝在Content-Disposition中的
let filename=decodeURI(res.headers.get("Content-Disposition").split("; ")[1].split("=")[1])
//正常流程res中是blob二進位制流
return res.blob().then(function(blob){/**這中間是儲存二進位制流的方法,網上很多就不敲了*/})
})
.catch(function(err){
//這裡我們說過,當http status不為200時,返回的是json
res.json().then(function(data){/**這裡的data就是json了。按照json的方式處理即可*/})
})
基本上就是這樣,今天這波問題出的我是猝不及防,本來想著在別的ajax上處理異常直接判斷就可以,萬萬沒想到下載這裡出了這種事情,今天卡的主要位置就是res轉json,怎麼轉都拿不到,去查了Promise模型才知道,fetch的request和response提供了arrayBuffer(),blob(),json(),text(),formData(),這些方法都實現了Promise模型(類似java的FunctionInterface),都需要進行callback才能操作資料。就像這樣:res.json().then(function(data){})
相關推薦
js下載檔案,並捕獲異常的記錄
在伺服器返回ResponseEntity<byte[]>這種二進位制流的情況下,對於異常的捕獲封裝返回的卻仍然是json,今天折騰了很久 總結如下: 該介面返回值為ResponseEntity<byte[]>,有異常攔截@[email p
Linux使用Shell指令碼實現FTP自動下載檔案,並記錄下載檔案日誌
Linux使用Shell指令碼實現FTP自動下載檔案,並記錄下載檔案日誌 最近初學shell程式設計,記一下自己寫的第一個指令
利用WGET下載檔案,並儲存到指定目錄
wget是Linux上一個非常不錯的下載指令,而其指令的內容雖然說是非常簡單,但內藏許多的引數,也算是Linux工作者常用的指令之一。 而這個指令我想在各大系統都預設有提供,包括了Ubuntu、Fedora等,而一般來說,要使用wget下載檔案,只需要打以下的
PHP強制下載檔案,並輸出檔名與檔案大小資訊
function getFileSize($url){ //獲取檔案大小函式 $url = parse_url($url); if($fp = @fsockopen($url['host'],empty($url['port'])?80:$url['port']
Ftp上傳下載檔案,並能自定義進度條展示(FtpClient)
前一段時間,自己寫了一個java專案釋出在一個免費的java平臺上但是該平臺給專案的是虛擬路徑並不能上傳檔案。後來想到應用ftp作為上傳檔案的儲存器。 ftp上傳的工具類有sun(sun.net.*)和apache(org.apache.commons.net.ftp.*
下載檔案,並彈出儲存提示框,選擇位置,絕對路徑 or相對路徑
1.因為Aiax不能返回流 所以用js表單提交發送請求 var form = document.createElement("form");document.body.appendChild(form);var nameInput = document.createEle
使用Android內部的DownloadProvider下載檔案,並獲取cache許可權 .
Android內部提供了一個DownloadProvider,是一個非常完整的下載工具,提供了很好的外部介面可以被其他應用程式呼叫,來完成下載工作。同時也提供和很好的下載、通知、儲存等機制。 在Android的Browser等工具裡面都用到了這個DownloadProvid
讀懂Android (1):使用Android內部的DownloadProvider下載檔案,並獲取cache許可權
Android內部提供了一個DownloadProvider,是一個非常完整的下載工具,提供了很好的外部介面可以被其他應用程式呼叫,來完成下載工作。同時也提供和很好的下載、通知、儲存等機制。 在Android的Browser等工具裡面都用到了這個DownloadProvid
js 把字串儲存為txt檔案,並下載到本地
程式碼如下 exportRaw('text.txt','123123123') function fakeClick(obj) { var ev = document.createEvent("MouseE
網頁JS下載多檔案,並改檔名
1、使用加入多個iframe方法,開啟多個連結function _createIFrame(url, triggerDelay, removeDelay) { setTimeout(() => { let frame = document.cre
HTML實現通過超連結下載檔案,還附帶一些js輔助函式
下載檔案函式 download (src, fileName) { let $a = document.createElement('a'); $a.setAttribute('href', src); $a.setAttribute('download', fileName);
關於html頁面展現pdf檔案,並隱藏列印、下載等按鈕的總結
關於html頁面展現pdf檔案,並隱藏列印、下載等按鈕的總結 由於專案需求,要在頁面預覽pdf檔案而不能提供下愛列印功能,故在網上查詢了一些前輩的經驗,自己也嘗試了一番,現在講經驗總結一下。 pdfobject.js jquery.media.js pdf.js
Linux運維之批量下載指定網站的100個圖片檔案,並找出大於200KB的檔案
題目為: 有一百個圖片檔案,它們的地址都是 http://down.fengge.com/img/1.png http://down.fengge.com/img/2.png … 一直到 http://down.fengge.com/img/100.png 批量下載這10
Linux從Ftp上下載最新檔案,並儲存到指定目錄(實現有點2--)
#!/bin/bash #PS4="#:" #set -x ip=a.b.c.d user=*** passwd=*** srcdir=~/Game ftp -n << ! open $ip 21 user $user $passwd prompt binary dir /server/Linux
Vue.js下載檔案及判斷上傳檔案型別,獲取上傳檔案大小
目錄 下載檔案 方法一 方法二 方法三 1.程式碼 1.程式碼 1.程式碼 下載檔案 所用的瀏覽器:Google Chrome 方法一 功能:點選匯出按鈕,提交請求,下載excel檔案; 1.跟後端
使用java將資料寫入檔案,並下載到客戶端
最近做了一個功能,覺得挺有意思,決定記錄下來,以前也見過類似的功能,以為很高階,其實很簡單。 第一步:寫一個建立檔案的工具類 public class CSVUtils{ /** * CSV檔案生成方法 * @param head
Python---對html檔案內容進行搜尋取出特定URL地址字串,儲存成列表,並使用每個url下載圖片,並儲存到硬碟上,使用正則re
Python—對html檔案內容進行搜尋取出特定URL地址字串,儲存成列表,並使用每個url下載圖片,並儲存到硬碟上,正則re 對目標回包內容取出這樣類似的內容: https://xian
匯出List列表中的資料到Excel檔案,並提供下載
整體思路 客戶在頁面點選“匯出Excel”連結-->>進入Java邏輯處理程式碼-->>複製Excel模版檔案-->>向這個複製過的模版檔案中寫入List資料-->>把資料寫入完成的Excel檔案下載到客戶端 適用場景 資料格
js中eval,arguments與異常處理的用法-基礎知識總結------彭記(017)
報錯 字符串 nts 字符 number 拖動 ron cnblogs 數組 eval的使用: <script> /*eval的作用: * 1.將字符串當成js代碼來執行 * 2.可以將json格式的字符串轉換為js對象*/