簡體   English   中英

正確實現RESTful大文件上傳的方法

[英]Proper way to implement RESTful large file upload

我一直在制作REST API已經有一段時間了,我仍然會遇到一個案例 - 大文件上傳。 我已經閱讀了其他幾個API,比如Google Drive,Twitter和其他文獻,我有兩個想法,但我不確定它們中的任何一個是“正確的”。 正如在適當的情況下,我的意思是它有點標准化,不需要太多的客戶端邏輯(因為其他方將實現該客戶端),或者甚至更好,它可以通過cURL輕松調用。 計划是用Java實現它,最好是Play Framework。

顯然,由於文件很大,我需要一些文件分區和服務器端緩沖機制。

所以,我得到的第一個解決方案是分段上傳( multipart/form-data )。 我得到了這種方式,之前我已經實現了這個方法,但實際上在客戶端模擬表單總是很奇怪,特別是因為客戶端必須設置文件密鑰名稱,根據我的經驗,這是一些東西客戶有點忘記或不理解。 另外,塊尺寸/零件尺寸是如何規定的? 什么阻止客戶端將整個文件放在一個塊中?

解決方案二,至少我理解的,但沒有找到實際的實現實現是“常規”POST請求可以工作。 內容應該分塊,數據在服務器端緩沖。 但是,我不確定這是一個正確的理解。 數據如何實際分塊,上傳是跨越多個HTTP請求還是在TCP級別上進行分塊? 什么是Content-Type

最重要的是,這兩個(或其他什么?)應該是一個客戶友好的,廣泛可理解的實現REST API文件上傳的方式?

我建議看看Amazon S3 Rest API的多部分文件上傳解決方案。 文檔可以在這里找到。

總結亞馬遜使用的程序:

  1. 客戶端發送啟動分段上傳的請求,API以上傳ID進行響應

  2. 客戶端使用部件號上傳每個文件塊(以維護文件的順序),部件的大小,部件的md5哈希值和上傳ID; 這些請求中的每一個都是單獨的HTTP請求。 API通過檢查md5散列接收的塊與客戶端提供的md5散列以及塊的大小是否與客戶端提供的大小相匹配來驗證塊。 API使用塊的標記(唯一ID)進行響應。 如果您跨多個位置部署API,則需要考慮如何存儲塊,然后以位置透明的方式訪問它們。

  3. 客戶端發出完成上載的請求,其中包含每個塊號的列表以及從API接收的關聯塊標記(唯一ID)。 API驗證沒有丟失的塊,並且塊號與正確的塊標記匹配,然后匯編文件或返回錯誤響應。

亞馬遜還提供了中止上傳的方法,並列出了與上傳相關聯的塊。 如果上載未在一定時間內完成,您可能還需要考慮上傳請求的超時,在該超時請求中銷毀塊。

在控制客戶端上傳的塊大小方面,您無法控制客戶端如何決定拆分上載。 您可以考慮為上載配置最大塊大小,並為包含大於最大大小的塊的請求提供錯誤響應。

我發現這個過程非常適合處理REST API中的大文件上傳,並且有助於處理與文件上載相關的許多邊緣情況。 不幸的是,我還沒有找到一個能夠以任何語言輕松實現的庫,因此您必須自己編寫所有邏輯。

https://tus.io/是可恢復協議,有助於塊上傳並在超時后恢復上傳。 這是一個開源實現,並且已經有不同語言的各種客戶端和服務器實現。

暫無
暫無

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

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