在Rails 4.2

时间:2017-11-14 22:45:43

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

我正在尝试使用带有input的标准HTML type="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代码段中请求的主体,正如预期的那样。

在不必自己编写multipart / form-data解析器的情况下获取数据的正确方法是什么?某个地方是否有一个函数可以获取这些原始数据并使用包含的上传函数吐出某种哈希或数组?

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

那么......人们应该如何接收POST&multi'dotpart / form-data?

由于

汤姆

1 个答案:

答案 0 :(得分:2)

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

  1. rails *内置了任何内容*简化处理多部分表单数据
  2. 自己动手并不容易
  3. * Rails 5.2将最终引入ActiveStorage,内置的光泽处理文件上传。

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