我正在尝试使用带有 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 可以为您处理此问题。它们存在的原因是因为
- rails 中没有内置任何内容* 可以简化处理多部分表单数据
- 自己做并不容易
*Rails 5.2最终将引入 ActiveStorage,这是用于处理文件上传的内置改进。
顺便说一句,文件上传会占用服务器进程。如果文件很大,这对于尝试访问您的应用程序的其他用户来说可能会非常痛苦,因为他们可能会超时。普遍的共识是将您的文件客户端上传到您选择的云存储提供商,而不是您的 Rails 服务器。 ActiveStorage 也将支持这一点。
关于javascript - 在 Rails 4.2 中解析 POSTed multipart/form-data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47296520/