【问题标题】:Parsing POSTed multipart/form-data in Rails 4.2在 Rails 4.2 中解析 POSTed multipart/form-data
【发布时间】:2017-11-14 22:45:43
【问题描述】:

我正在尝试使用标准 HTML inputtype="file" 实现具有多选支持的简单 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 sn-p 的请求的主体,正如预期的那样。

在不必自己编写多部分/表单数据解析器的情况下获取该数据的正确方法是什么?是否有某个函数可以获取这些原始数据并通过包含的上传输出某种​​哈希或数组?

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

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

谢谢

汤姆

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。我希望避免向这个已经很大的项目添加另一个依赖项,但看起来就是这样,放弃 multipart,或者编写我自己的支持。
    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多