javascript - 在 Rails 4.2 中解析 POSTed multipart/form-data

标签 javascript ruby-on-rails ruby post multipartform-data

我正在尝试使用带有 type="file" 的标准 HTML input 来实现一个简单 AJAX 图像 uploader ,并支持多选。 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 片段的请求正文,如预期的那样。

无需自己编写多部分/表单数据解析器即可获取该数据的正确方法是什么?是否有某个函数可以获取这些原始数据并输出某种包含上传内容的哈希或数组?

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

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

谢谢

汤姆

最佳答案

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

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

*Rails 5.2最终将引入 ActiveStorage,这是用于处理文件上传的内置改进。

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

关于javascript - 在 Rails 4.2 中解析 POSTed multipart/form-data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47296520/

相关文章:

javascript - 为什么这段 JavaScript 代码不能在文档就绪中运行,但是当我将它包装在脚本类型中时却可以运行?

javascript - AngularJS 菜单在 MEAN.js 中是公共(public)的

ruby-on-rails - rails seo url,转换为空格

ruby-on-rails - 捆绑安装错误 : Source does not contain any versions of

ruby - Rails update_all 与 hstore

javascript - ng-repeat 中的函数导致无限 $digest-loop

javascript - 除了 3 维数组之外,还有更好的方法来管理基于网格的游戏吗?

ruby-on-rails - 如何在 Ruby on Rails 中存储私有(private)图片和视频

Ruby:隐式 block 转换为 Proc

Javascript 或 RoR 适用于各种应用程序?