前言
很多時候,我們需要提供檔案下載或在線查看功能,而且要求有權限才能下載,那么一般通過檔案流方式來做,相對來說實作起來也比較簡單,后端讀取檔案回傳檔案流即可,然而這種方式最大的缺點是記憶體消耗大,如果下載的檔案比較大或者下載請求多,很容易造成服務器記憶體溢位甚至服務宕機,本文將通過靜態檔案方式下載,以同時滿足性能和安全性要求,
一、目的
- 下載鑒權
- 靜態檔案下載
- 隱藏真實靜態檔案路徑
二、實作方案

服務支持:前端服務(部署nginx)、后端服務(提供鑒權介面,可以是微服務),
描述:客戶發起一個下載請求,前端服務nginx接收到請求后轉發給后端鑒權介面處理,鑒權成功需在回應頭回傳三個引數Content-Disposition(用于指定下載檔案名稱,即客戶端的檔案名)、Content-Type(型別,一般為application/octet-stream)、X-Accel-Redirect(指定需下載的檔案路徑),nginx接收到回應后即可下載檔案,
二、實作步驟
1.前端服務Nginx配置
請求轉發:
location ^~ /api/ {
proxy_redirect off;
proxy_pass http://localhost:8080/api/;
}
內部下載:
location /file/ {
internal;
root /;
}
2.后端回傳回應頭資訊
代碼:
response.setHeader("Content-Disposition","attachment;filename=檔案名.pdf");
response.setHeader("Content-Type","application/octet-stream");
response.setHeader("X-Accel-Redirect","/file/test.pdf");
假設前置服務訪問鏈接:http://localhost:8080,后端服務鑒權介面訪問鏈接:http://localhost:8081/api/auth,則下載鏈接可以是:http://localhost:8080/api/auth?token=xxx,實際訪問的靜態檔案鏈接:http://localhost:8080/file/test.pdf,因為使用了internal,該鏈接已被屏蔽,無法直接訪問,
總結
本文通過nginx的internal及回傳回應頭引數的方式介紹靜態檔案下載鑒權實作方案,滿足性能和安全性要求,如大家有更好的方案,歡迎討論交流,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/348323.html
標籤:其他
上一篇:瀏覽器播放rtsp視頻流解決方案
