req.file()
建立並回傳 Skipper Upstream,代表從指定的 field
傳入的多部分檔案上傳。
req.file(field);
參數 | 類型 | 詳細資訊 | |
---|---|---|---|
1 | field |
要監聽上傳的檔案參數名稱;例如:avatar 。 |
req.file()
來自 Skipper,這是原始 Connect body parser 的意見導向變體。Skipper 讓您可以利用高效能、串流檔案上傳,而無需對您的應用程式邏輯進行任何重大變更。
這種簡化帶來了一個小小的注意事項:文字參數必須包含在請求 body 中的檔案之前。 通常,這些文字參數包含字串元數據,提供有關檔案上傳的額外資訊。
發送到 Sails 的多部分請求應先發送所有文字參數,然後再發送任何檔案參數。 例如,如果您正在構建與 Sails 通訊的 Web 前端,則應在任何表單上傳或 AJAX 檔案上傳請求中首先包含文字參數。「文字參數」一詞指的是您可能與檔案一起發送的元數據參數,以提供有關上傳的額外資訊。
Skipper 將所有檔案上傳視為串流。 這允許使用者上傳龐大的檔案,而對效能的影響極小,且不佔用磁碟空間,同時保護您的應用程式免受涉及 TMP 檔案的惡意阻斷服務攻擊。
當多部分請求到達您的伺服器時,Skipper 不會將臨時檔案寫入磁碟,而是緩衝請求,時間足夠執行您的應用程式程式碼,讓您可以「插入」相容的 Blob 接收器。 如果您沒有「插入」來自特定欄位的資料,Upstream 將達到其「高水位線」,緩衝區將被清除,並且後續在該欄位上傳入的位元組將被忽略。
在控制器動作或策略中
// See the Skipper README on GitHub for usage documentation for `.upload()`, including
// a complete list of options.
req.file('avatar').upload(function (err, uploadedFiles){
if (err) return res.serverError(err);
return res.json({
message: uploadedFiles.length + ' file(s) uploaded successfully!',
files: uploadedFiles
});
});
- 請記住,用戶端請求的文字參數必須在檔案參數之前發送!
req.file()
支援透過同一個欄位發送多個檔案,但重要的是要意識到,因此,它回傳的 Upstream 實際上是一個潛在二進制串流(檔案)的串流(緩衝事件發射器)。 具體來說,Upstream
是一個 Node.js Readable stream,處於「物件模式」,其中每個物件本身都是一個傳入的多部分檔案上傳串流。- 如果您希望直接使用 Upstream 作為串流的串流,您可以省略
.upload()
方法並綁定 "finish" 和 "error" 事件(或使用.pipe()
)來替代。 在底層,.upload()
所做的只是將 Upstream 導管到指定的接收器實例中,然後在 Upstream 發出finish
或error
事件時執行指定的回呼。