解析在 Rails 4.2 中发布的 multipart/form-data

Parsing POSTed multipart/form-data in Rails 4.2

我正在尝试使用标准 HTML input 和 [=14] 实现一个 简单 AJAX 支持多选的图片上传器=]. JS上传代码如下:

var files = document.getElementById("txtFiles").files;
var formData = new FormData();

for (var file = 0; file < files.length; file++) {
  formData.append("userimage", files[file], name)
}

//throw up a loading bar while we're uploading
util.loaderShow("Uploading, please wait...");

$.ajax({

  url: '#{upload_alert_image_url}',

  data: formData,
  processData: false,
  contentType: 'multipart/form-data',
  type: 'POST',

  success: function() {
    util.loaderHide();
    alert("Got success!");
    finish_upload();
  },

  error: function(e) {
    util.loaderHide()
    alert("Upload failed: "+e);
  },

  complete: function() {
    util.loaderHide();
  }

})

在 Rails 方面,现在 request.body 被简单地保存到一个临时文件中,并且在该临时文件中是来自上述 JS 片段的请求正文,正如预期的那样.

无需自己编写 multipart/form-data 解析器即可获取该数据的正确方法是什么?某处是否有一个函数可以获取这些原始数据并通过包含的上传吐出某种哈希或数组?

我一直在谷歌搜索和搜索 SO 和 Rails 文档一两个小时,试图找到答案。有各种各样的 gem 可以处理文件上传(其中大部分都有我不想要的其他问题)以及 multipart-parser,我已经检查了这些......但是考虑到 multipart/form-data 是古老而有用的,我很难相信在我不看的地方没有现成的支持。根据其文档,Rack::Middleware 声称有一个 .extract_multipart class 方法,但我不知道如何访问它。

那么...应该如何接收 POST 的 multipart/form-data?

谢谢

汤姆

正如您所提到的,有许多 gem 可以为您处理此问题。它们存在的原因是因为

  1. 没有任何内置内容 rails* 简化多部分表单数据的处理
  2. 自己做不容易

*Rails 5.2 将最终 引入 ActiveStorage,用于处理文件上传的内置优化。

顺便说一句,文件上传会占用服务器进程。如果文件很大,这对于尝试访问您的应用程序的其他用户来说可能会非常痛苦,因为他们可能会超时。普遍的共识是将您的文件客户端上传到您选择的云存储提供商,而不是您的 rails 服务器。 ActiveStorage 也将支持这一点。