【发布时间】:2011-05-12 12:45:04
【问题描述】:
我正在寻找一个 HTML 5 AJAX 库/框架供用户将文件直接上传到 Amazon S3。目标是避免将附件上传到网络服务器(因为网络服务器在将它们传输到亚马逊时会阻塞)。我的理解是,这应该可以使用XDomainRequest,但我不知道怎么做。
我正在运行 ruby-on-rails 并希望为上传的文件分配一个临时名称(使用 UUID),该名称将被发布回 Web 服务器,以便稍后可以重命名该文件并与回形针集成。
有什么想法吗?这是jQuery可以处理的吗? Flash 不是该项目的选项。谢谢!
编辑:
我设法让一个基本的帖子工作,但我仍然有问题。我不确定需要哪些标头,或者如何在请求中编码 Amazon 所需的参数(我可以将它们放在请求标头中吗?)。这是我迄今为止的进展:
const XMLHTTPFactories = [
function () { return new XDomainRequest(); },
function () { return new XMLHttpRequest(); },
function () { return new ActiveXObject("Msxml2.XMLHTTP"); },
function () { return new ActiveXObject("Msxml3.XMLHTTP"); },
function () { return new ActiveXObject("Microsoft.XMLHTTP"); },
];
var xhr = null;
for (var i = 0; i < XMLHttpFactories.length; i++) {
try { xhr = XMLHttpFactories[i](); break; } catch (exception) { continue; }
}
$(this).change(function () {
for (var i = 0; i < this.files.length; i++) {
var file = this.files[i];
xhr.open(settings.method, settings.url, true);
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.setRequestHeader("Access-Control-Allow-Origin", "*")
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader("X-File-Name", file.fileName);
xhr.setRequestHeader("X-File-Size", file.fileSize);
xhr.send(file);
}
编辑:
进一步更新后,我设法得到以下错误:
XMLHttpRequest 无法加载 http://bucket.s3.amazonaws.com/。 来源http://local.app 是 不允许 访问控制允许来源。
我上传了一个crossdomain.xml 文件,该文件允许从通配符 (*) 域进行访问。不知道如何继续...
编辑:
在进行了更多调查后,我开始认为 JavaScript POST 可能无法用于 S3。在进行转移之前,我是否需要发布到 EC2 实例?我也许能够保护一个微型实例,但如果可能的话,我更愿意直接进入 S3!谢谢!
编辑:
我在亚马逊论坛上发布了这个问题,但没有收到任何反馈。对于交叉引用,可以在此处找到其他帖子:https://forums.aws.amazon.com/message.jspa?messageID=206650#206650。
【问题讨论】:
标签: ruby-on-rails html file-upload amazon-s3 amazon-ec2