req.file()
构建并返回一个表示从指定field
接收到的多部分文件上传的Skipper Upstream。
req.file(field);
参数 | 类型 | 详情 | |
---|---|---|---|
1 | field |
用于监听上传的文件参数名称;例如:avatar 。 |
req.file()
来自Skipper,它是原始 Connect 体解析器的有见地的变体。Skipper 允许您利用高性能、流式文件上传,而无需对您的应用程序逻辑进行重大更改。
这种简化带来一个小小的警告:文本参数必须在请求主体中的文件之前包含。 通常,这些文本参数包含提供有关文件上传的附加信息的字符串元数据。
发送到 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 可读流,处于“对象模式”,其中每个对象本身都是一个传入的多部分文件上传流。- 如果您更愿意直接使用 Upstream 作为流的流,您可以省略
.upload()
方法并绑定“finish”和“error”事件(或使用.pipe()
)。在幕后,所有.upload()
所做的就是将Upstream管道化到指定的接收器实例中,然后在 Upstream 发出finish
或error
事件时运行指定的回调。
req
)