上傳文件服務與web服務分離


業務場景:
1. 后端服務為java web應用,使用tomcat容器,多實例集群化部署。
2. 前端使用nginx作為后端應用的反向代理。

業務需求:
現在需要在java web應用端上傳文件,同時還要能支持文件下載。

設計方案:
1. 文件應該專門使用文件服務器進行存儲,在數據庫中存儲文件下載鏈接即可。
2. tomcat容器本身不擅長做文件上傳下載的事情,所以最好將文件上傳下載的功能與web服務分離,比如使用nginx作為文件服務器。

具體實現:
通常,針對簡單的應用,可以使用NFS,在web端上傳文件后直接寫到文件服務器;或者將文件上傳到web應用之后,再將文件同步到文件服務器。
不論是通過NFS或者任何其他同步工具的方式,都存在文件中轉的過程,必須先將文件通過web應用進行上傳保存,再同步到文件服務器。中間可能存在同步出錯或延時,也存在擴展性不好的問題。
所以,設計實現方案如下:

1. 使用http協議通過web表單方式上傳文件。
2. 在文件服務器上部署web服務器,專門用於文件上傳。
3. 通常在web應用中上傳文件時,除了上傳文件數據,還需要傳遞一些文字。文字保存在數據庫中,文件保存在服務器上,同時將生成文件下載鏈接保存在數據庫。
4. 通過MD5校驗文件內容,避免相同文件因為文件名不同而被惡意上傳導致大量垃圾文件占滿磁盤空間。

結合實際的業務需求,我們的上傳文件流量不是很大,所以還是直接使用tomcat作為文件上傳的web服務。文件下載使用nginx。
另外,為了避免需要通過在session中保存數據帶來的問題,盡量將參數保存在request進行傳遞。舉個例子:
通常在tomcat中會將用戶登錄的數據保存在session中,便於進行用戶合法性驗證,而文件上傳時請求是在文件服務器上處理,無法獲取到tomcat中的session對象。
為了解決這個問題,可以將session中的數據通過request傳遞到頁面,在文件上傳時又通過參數的方式傳遞給文件服務器。
直接傳遞參數存在安全漏洞,應該將參數進行加密處理。

特別注意:
經過驗證,分離web服務和文件上傳服務是可行的,但是因為存在跨域問題,所以在文件上傳服務中必須要設置消息頭:Access-Control-Allow-Origin。
具體的Servlet代碼如下:

public class FileUploadServlet extends HttpServlet {
    @Override
    protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setHeader("Access-Control-Allow-Origin", "*"); //在options方法中設置跨域消息頭
        super.doOptions(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //處理文件上傳邏輯
    }
}


【參考】
https://segmentfault.com/q/1010000007377501  站點做動靜分離,如何處理用戶上傳文件呢?
http://www.cnblogs.com/rainy-shurun/p/5407085.html 上傳文件服務器與web內容服務分離
http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb學習總結(五十)——文件上傳和下載
https://stackoverflow.com/questions/304268/getting-a-files-md5-checksum-in-java Getting a File's MD5 Checksum in Java


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM