檔案上傳和下載功能
1 需求
檔案上傳功能在IM系統裡,一般都會涉及到的。那檔案上傳也分單聊和群聊兩種情況。之前系統實現了單聊傳送檔案的情況,目前需要實現群聊裡傳送檔案。群聊和單聊傳送檔案功能,對客戶端來說流程可能差不多,單對伺服器來說,差別就不是一點點了。
2 實現
2.1 現有系統實現
現有系統中,檔案上傳功能的實現如下:
1 客戶端通過與訊息伺服器的長連線,傳送檔案請求到訊息伺服器,請求資訊包括髮送使用者id、接收使用者id、檔名稱、檔案大小、傳送模式(離線,線上,現在實現的是離線模式)。
2 訊息伺服器接收到客戶端的請求後,傳送訊息到檔案伺服器。
3 檔案伺服器根據請求,生成任務id。
4 檔案伺服器應答訊息伺服器請求,應答資訊主要包括任務id、傳送使用者id等。
5 訊息伺服器應答客戶端請求,應答資訊主要包括任務id、檔案伺服器ip資訊等。這裡的檔案伺服器ip資訊是訊息伺服器通過請求檔案伺服器獲得。這個ip資訊是在檔案伺服器的配置檔案裡配置的。
6 客戶端拿到檔案伺服器ip資訊,就連線檔案伺服器,拿著任務id資訊傳送登入請求到檔案伺服器。
7 客戶端登入成功後,檔案伺服器向客戶端拉取檔案資料,並儲存成檔案。
8 檔案伺服器拉取完檔案資料後,傳送檔案狀態為完成狀態到客戶端。
9 客戶端收到傳送完成狀態,傳送增加離線檔案請求到訊息伺服器。
10 訊息伺服器收到請求,傳送請求到DB伺服器,儲存離線檔案資訊到資料庫,資訊包括髮送使用者id,接收使用者id,檔名稱,檔案大小,任務id,檔案伺服器ip資訊等。當接收使用者線上時候,傳送檔案通知訊息到接收使用者。
在客戶端收到檔案通知訊息或者拉取到有離線檔案列表時候,就需要進行檔案下載。現有系統,檔案下載功能的實現如下:
1 客戶端登入檔案伺服器,這裡不用通過訊息伺服器獲取檔案伺服器的地址,而是在離線檔案資訊裡包括了。
2 客戶端登入成功後,傳送拉取檔案資料請求。
3 當客戶端拉取檔案資料完成,檔案伺服器傳送檔案狀態為完成狀態到客戶端。
4 客戶端傳送刪除離線檔案請求到訊息伺服器,訊息伺服器請求DB伺服器更改檔案狀態。
2.2 問題
1 流程相對複雜。
2 任務id是根據檔案關聯,一次只能傳送一個檔案請求。
3 根據現有的檔案上傳和下載邏輯,當有多臺檔案伺服器的時候,通過哪個上傳的,還必須通過哪個下載。
4 檔案上傳完成後,客戶端傳送訊息到訊息伺服器,再通過DB伺服器儲存檔案資訊到資料庫。那如果客戶端不傳送,那麼檔案其實已經是上傳成功了的。
5 傳送增加或刪除離線檔案請求都是單向的,伺服器沒有給客戶端做應答。這個不能保證資料一致性。
6 上傳完成和下載完成的狀態通知是沒有必要的。伺服器判斷完成的標誌是資料傳輸的大小是否為0,那這個在應答的時候傳輸為0的請求,那麼客戶端即知道檔案傳輸完成了。
7 丟包判斷,目前沒有對丟包判斷。即傳輸資料大小和包裡的資料大小是否一致的判斷。
2.3 改進方案
1 上傳檔案的時候,檔案伺服器地址,改為在登入伺服器裡配置獲取。同時在有多臺檔案伺服器時候,進行均衡處理。
2 任務id改為由客戶端生成。
3 下載檔案的時候,檔案伺服器地址也用登入時候返回的檔案伺服器地址。如果考慮負載情況,那在客戶端登入檔案伺服器的時候,返回登入失敗。如果客戶端登入檔案伺服器失敗,則再請求一次登入伺服器,獲取新的檔案伺服器地址。或者由檔案伺服器獲取新的地址,在登入返回的時候一起返回到客戶端。
4 上傳完成和下載完成狀態不單獨傳送,用請求或應答包裡的大小為0作為判斷依據。
5 增加和刪除離線檔案請求,改為伺服器內部處理訊息。
相關文章
- 檔案上傳下載
- 基於SpringWeb MultipartFile檔案上傳、下載功能SpringWeb
- 檔案上傳與下載
- JAVA檔案上傳下載Java
- Vertx 檔案上傳下載
- centos上傳下載檔案CentOS
- 教你如何實現c#檔案上傳下載功能C#
- spring cloud feign 檔案上傳和檔案下載SpringCloud
- 前端實現檔案下載和拖拽上傳前端
- SpringMVC中的檔案上傳和下載SpringMVC
- Java Struts檔案上傳和下載詳解Java
- 基於servlet的檔案上傳和下載Servlet
- 檔案的上傳與下載
- 使用SecureCRT上傳下載檔案Securecrt
- java上傳檔案跟批量下載檔案Java
- Java SE 檔案上傳和檔案下載的底層原理Java
- springboot 中檔案的上傳和下載Spring Boot
- Jsp+Servlet實現檔案上傳下載(一)--檔案上傳JSServlet
- SpringMVC檔案上傳下載(單檔案、多檔案)SpringMVC
- minio檔案上傳與下載
- springboot 檔案上傳下載Spring Boot
- 檔案上傳下載小工具
- java 上傳 下載檔案工具類Java
- 檔案下載上傳小工具
- spring webflux檔案上傳下載SpringWebUX
- iterm2上傳下載檔案
- 從ftp上傳下載檔案(二)FTP
- 從ftp上傳下載檔案(一)FTP
- asp.net 檔案上傳和下載管理原始碼ASP.NET原始碼
- MinIO上傳和下載檔案及檔案完整性校驗.
- Netty接收HTTP檔案上傳及檔案下載NettyHTTP
- Spring Boot 檔案上傳與下載Spring Boot
- xshell 使用 sftp上傳下載檔案FTP
- Struts2的檔案上傳下載
- Feign實現檔案上傳下載
- Koa2 之檔案上傳下載
- 【liunx命令】上傳下載檔案的方法
- (iPhone/iPad)檔案上傳與下載iPhoneiPad