前端Nuxt 下載 後端 Larvel 提供的 Excel Zip 等BinaryFileResponse 檔案

本篇主要解決後端Laravel 所以提供的BinaryFileResponse 檔案讓前端Nuxt可以正確下載並且賦予後端提供的檔案名稱

參考資料

https://stackoverflow.com/questions/70911768/laravel-axios-file-download

https://www.cnblogs.com/theblogs/p/17477046.html

Use Zip Archive with PHP

首先,後端Laravel的部分

Excel的範例

假設今天要回傳的檔案是Laravel Excel產生的一個.xlsx檔案的話,我們通常會這樣做

EXPORT_CLASS是將資料處理成excel檔案的一個class,這邊就不多提,DOWNLOAD_FILE_NAME就是設定好要讓瀏覽器下載的檔案名稱

這時候如果適用post man 或者瀏覽器直接瀏覽這個後端URL都會直接下載到一個.xlsx檔案

那如果要讓前端正確下載到這個檔案名稱可以這樣做

簡單解釋一下參數

第三個參數:\Maatwebsite\Excel\Excel::XLSX 代表要輸出是xlsx檔案

第四個參數是header,主要是要將Content-Disposition曝露出來前端Axios才能夠正確抓到檔案名稱

注意一下,這邊執行的Excel::download的會傳值是一個 Symfony\Component\HttpFoundation\BinaryFileResponse

如果後端API有自訂response格式也可以調整一下讓檔案回傳這支API符合BinaryFileResponse類型就可以

ZIP的範例

後端第二個範例是,如果要下載的是一個zip檔,我們可以這樣做

說明一下幾件事情

1. tempnam 產出一個檔案在指定路徑底下,sys_get_temp_dir()則是取得當下系統的暫存檔資料夾,所以這樣子可以產生一個php的暫存檔

2. $download_name存下系統產生的這個暫存檔檔名不含路徑

3. $zip->addFromString(); 或是 $zip->addFile(); 就自行依照情況取用,可參考上方外部連結資訊

4. 最後Response::download 參數與Excel::download() 大致相同,都是記得在header中把Content-Disposition曝露出來即可

 

接著,前端的做法

Request部分

後端回傳的資料格式為BinaryFileResponse,前端再透過Axios呼叫的時候也記得指定responseType,例如以下

那麽,拿到response之後,後端原本提供的檔案名稱可以在header中這樣取得

Download部分

最後,要讓檔案下載的方式可以參考下方範例

同樣說明一下內容,首先拿到file_name之後,很神奇的資料會變成_XXX.zip 多了一個底下,因此用substring稍微處理了一下

剩下的邏輯就是在頁面上產生一個<a> Tag,並且把response放入,最後點擊連結讓瀏覽器下載檔案

以上