簡體   English   中英

如何使用 javascript 從 API 下載內聯 pdf?

[英]How to download an inline pdf received from API using javascript?

我有一個后端可以處理帶有 pdf 的各種操作,其中之一 - 將多個 pdf 合並為一個。

場景如下:

  • 用戶在一個虛擬列表中排列多個 pdf,並為該列表命名。
  • 用戶點擊“下載列表”按鈕。
  • 通過 API 調用后端 (Laravel) 以合並所需的 pdf 並返回文件響應。 return response()->file(realpath($pathToFile), ['Content-Disposition' => 'inline; filename="'.$file,'Content-Type' => 'application/pdf']);

我需要做的是在新的 window 中打開這個收到的文件作為內聯 pdf 預覽,但我必須將它命名(我嘗試使用 blob,但沒有提供標題的選項),以便當用戶點擊“下載” pdf 查看器的按鈕,他們得到一個命名下載,它由列表標題命名。 聽起來像是一項非常基本的任務,但我找不到任何適當的解決方案來實現這一目標。 將 url 提供給文件而不是文件響應也不是一種選擇,因為用戶只能下載他們的列表,並且他們不應該能夠直接通過 url 檢索這些文件。

我設法通過繞行解決了我的問題,這可能不是最優化的解決方案,而且感覺有點 hack-ish,但這是唯一對我有用的解決方案。

我在我的 API 后端創建了兩條路由:

第一條路線

Route::post('/download-file', 'PdfProcessController@downloadFileApi'); 接受文件id作為參數。 downloadFileApi方法檢查用戶是否有權訪問所需文件,如果有,則使用Sanctum發出令牌$token = Auth::user()->createToken('access_file_token'); 最后,此方法返回 url,這是使用生成的令牌調用第二個 API 路由return sprintf('%s/api/download-file/%s?_token=%s', env('APP_URL'), $request->input('id'), $token->plainTextToken);

第二條路線Route::get('/download-file/{hash}', 'PdfProcessController@downloadFile')->middleware(['token.to.header', 'auth:sanctum']); token.to.header中間件是基於此答案實現的。 通過 Laravel Sanctum 進行身份驗證,通過將令牌作為 GET 查詢參數傳遞內部downloadFile令牌被破壞(因為它已被使用)並返回內聯 Z43700941ED 。

在我的前端我做

this.$axios.post('/api/download-file', {id: fileid})
.then(response => {
  window.open(response.data, '_blank');
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM