欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot X-Accel-Redirect 大文件下載實現(xiàn)

 更新時間:2023年06月09日 11:50:14   作者:Mr-Wanter  
本文主要介紹了springboot X-Accel-Redirect 大文件下載實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

文件下載的方式:

  • nginx代理附件路徑,直接訪問。無法控制用戶的權限。
  • 服務端流式讀取文件內容。這個過程需要后端進程將文件讀取到內存中然后再發(fā)給用戶,會造成很大的資源開銷。如果你文件較大,可能會超時,并且會占用比較大的內存,當用戶下載量很大時有可能造成程序的崩潰。
  • 服務端權限控制后通過X-Accel-Redirect 重定向到nginx代理地址。傳輸快、服務器IO低,但是無法跟蹤下載進度。

一、什么是 X-Sendfile?

X-Sendfile是一種將文件下載請求由后端應用轉交給前端web服務器處理的機制,它可以消除后端程序既要讀文件又要處理發(fā)送的壓力,從而顯著提高服務器效率,特別是處理大文件下載的情形下。

X-Sendfile 通過一個特定的 header 來實現(xiàn):在 X-Sendfile 頭中指定一個文件的地址來通告前端 web 服務器。當 web 服務器檢測到后端發(fā)送的這個 header 后,它將忽略后端的其他輸出,而使用自身的組件(包括 緩存頭 和 斷點重連 等優(yōu)化)機制將文件發(fā)送給用戶。

不過,在使用 X-Sendfile 之前,我們必須明白這并不是一個標準特性,在默認情況下它是被大多數 web 服務器禁用的。而不同的 web 服務器的實現(xiàn)也不一樣,包括規(guī)定了不同的 X-Sendfile 頭格式。如果配置失當,用戶可能下載到 0 字節(jié)的文件。

nginx: X-Accel-Redirect

squid: X-Accelerator-Vary

apache: X-Sendfile

lighttpd: X-Sendfile/X-LIGHTTPD-send-file

使用X-Sendfile的缺點是你失去對文件傳輸機制的控制,后臺不知道文件是否下載成功。

Nginx 默認支持該特性 ,不需要加載額外的模塊。只是實現(xiàn)有些不同, 需要發(fā)送的 HTTP 頭為 X-Accel-Redirect。

X-Accel-Redirect:
這個功能允許你在后端處理權限,日志或任何你想干的,Nginx提供內容服務給終端用戶從重定向后的路徑,因此可以釋放后端去處理其他請求(直接由Nginx提供IO,而不是后端服務)。這個功能類似X-Sendfile 。

二、相關請求頭說明

X-Accel-Limit-Rate
限制下載速度,單位字節(jié)。默認不限速度。

X-Accel-Buffering
設置此連接的代理緩存,將此設置為no將允許適用于Comet和HTTP流式應用程序的無緩沖響應。將>此設置為yes將允許響應被緩存。默認yes。

X-Accel-Expires
如果已傳輸過的文件被緩存下載,設置Nginx文件緩存過期時間,單位秒。默認不過期。

X-Accel-Charset
設置文件字符集,默認UTF-8

三、實現(xiàn)步驟

前置條件:

需要前端請求的Referer 和 nginx 在同一臺機器,或者nginx代理到最終附件服務器的nginx地址nginx代理附件地址和附件下載服務(保證代理和服務在同一個ip 端口下)

location /protected_files {
? ? internal; ? ? # internal 表示這個路徑只能在 Nginx 內部訪問,不能用瀏覽器直接訪問防止未授權的下載
? ? alias /mnt/files;
}
location /gsdss-api/ {
? ? ? ?#OPTIONS請求處理
? ? ? ?if ($request_method = 'OPTIONS') {
? ? ? ? ? ? ? ?add_header 'Access-Control-Max-Age' 1728000;
? ? ? ? ? ? ? ?add_header Access-Control-Allow-Origin *;
? ? ? ? ? ? ? ?add_header Access-Control-Allow-Credentials true;
? ? ? ? ? ? ? ?add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
? ? ? ? ? ? ? ?add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,token,orgcode';
? ? ? ? ? ? ? ?return 200;
? ? ? ?}
? ? ? ?proxy_pass 網關地址;
? ? ? ?proxy_set_header Host $host;
? ? ? ?proxy_set_header X-Real-IP $remote_addr;
? ? ? ?proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
? ? ? ?client_max_body_size 100m;
? ? ? ?proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}

java處理鑒權后直接重定向到nginx代理地址

    public void downloadByLink(HttpServletResponse response, String fileId) {
        //查詢附件信息
        AttachmentResp resp = attachmentService.findByAttachId(fileId);
        //鑒權實際已經通過gateway完成
        try {
            String fileName = URLEncoder.encode(resp.getFileName(), "UTF-8");
            response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setHeader("X-Accel-Redirect", "/upload" + resp.getPath()); //設置URI給nginx進行內部的跳轉
            response.setHeader("X-Accel-Limit-Rat", "202400"); //限速
        } catch (UnsupportedEncodingException e) {
            log.error("文件下載失敗 ", e);
            throw new BusinessException("文件下載失敗");
        }
    }

總結

常規(guī)請求路徑

前端nginx:前端訪問nginx代理網關路徑

后端nginx:

  • 代理網關路徑轉發(fā)到實際網關地址
  • 網關分發(fā)到附件服務
  • 附件服務處理請求

為了保證nginx代理的下載路徑和附件下載服務在同一ip和端口那么這個nginx代理需要2層實現(xiàn)

 到此這篇關于springboot X-Accel-Redirect 大文件下載實現(xiàn)的文章就介紹到這了,更多相關springboot X-Accel-Redirect 大文件下載內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • springboot靜態(tài)資源的配置方式

    springboot靜態(tài)資源的配置方式

    這篇文章主要介紹了springboot靜態(tài)資源的配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 利用Java代碼寫一個并行調用模板

    利用Java代碼寫一個并行調用模板

    這篇文章主要介紹了利用Java代碼寫一個并行調用模板,文章基于Java的相關內容展開寫一個并行調用模板的詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • 命令提示符編譯java的方法(必看篇)

    命令提示符編譯java的方法(必看篇)

    下面小編就為大家?guī)硪黄钐崾痉幾gjava的方法(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 如何把idea中的項目導入github倉庫中(圖文詳解)

    如何把idea中的項目導入github倉庫中(圖文詳解)

    這篇文章主要介紹了如何把idea中的項目導入github倉庫中,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • JPA之QueryDSL-JPA使用指南

    JPA之QueryDSL-JPA使用指南

    Springdata-JPA是對JPA使用的封裝,Querydsl-JPA也是基于各種ORM之上的一個通用查詢框架,使用它的API類庫可以寫出Java代碼的sql,下面就來介紹一下JPA之QueryDSL-JPA使用指南
    2023-11-11
  • java將m3u8格式轉成視頻文件的方法

    java將m3u8格式轉成視頻文件的方法

    這篇文章主要介紹了如何java將m3u8格式轉成視頻文件,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Java8?Stream?collect(Collectors.toMap())的使用

    Java8?Stream?collect(Collectors.toMap())的使用

    這篇文章主要介紹了Java8?Stream?collect(Collectors.toMap())的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java關于遠程調試程序教程(以Eclipse為例)

    Java關于遠程調試程序教程(以Eclipse為例)

    這篇文章主要介紹了Java關于遠程調試程序教程(以Eclipse為例),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • java如何用遞歸生成樹形結構

    java如何用遞歸生成樹形結構

    作者分享了自己在使用腳本之家資源進行編程時的經驗,包括準備實體對象、測試數據、構造樹形結構遞歸函數、測試以及輸出結果等步驟,作者希望這些經驗能對大家有所幫助,并鼓勵大家支持腳本之家
    2025-03-03
  • bool當成函數參數錯誤理解

    bool當成函數參數錯誤理解

    經常會在函數的參數里使用bool參數,這會大大地降低代碼的可讀性
    2012-11-11

最新評論