编辑页面

req.file()

构建并返回一个表示从指定field接收到的多部分文件上传的Skipper Upstream

req.file(field);

用法

#
参数 类型 详情
1 field String 用于监听上传的文件参数名称;例如: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 发出finisherror事件时运行指定的回调。

是否有遗漏内容?

如果您发现我们遗漏了或可以改进的内容,请按照此链接提交到 sails repo 的拉取请求。在我们合并后,更改将在网站下次部署时反映出来。

参考

参考