Ruby on rails HTML5AmazonS3直接上传程序

Ruby on rails HTML5AmazonS3直接上传程序,ruby-on-rails,html,file-upload,amazon-s3,amazon-ec2,Ruby On Rails,Html,File Upload,Amazon S3,Amazon Ec2,我正在寻找一个HTML5Ajax库/框架,供用户直接将文件上传到AmazonS3。目标是避免将附件上载到web服务器(因为web服务器在将附件传输到Amazon时会阻塞)。我的理解是,使用XDomainRequest应该可以实现这一点,但我不知道如何实现 我正在运行RubyonRails,希望为上传的文件分配一个临时名称(使用UUID),该名称将发布回web服务器,以便稍后可以重命名该文件并与曲别针集成 有什么想法吗?这是jQuery可以处理的吗?Flash不是此项目的选项。谢谢 编辑: 我设法

我正在寻找一个HTML5Ajax库/框架,供用户直接将文件上传到AmazonS3。目标是避免将附件上载到web服务器(因为web服务器在将附件传输到Amazon时会阻塞)。我的理解是,使用
XDomainRequest
应该可以实现这一点,但我不知道如何实现

我正在运行RubyonRails,希望为上传的文件分配一个临时名称(使用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);
  }
const XMLHTTPFactories=[
函数(){返回新的XDomainRequest();},
函数(){返回新的XMLHttpRequest();},
函数(){返回新的ActiveXObject(“Msxml2.XMLHTTP”);},
函数(){返回新的ActiveXObject(“Msxml3.XMLHTTP”);},
函数(){返回新的ActiveXObject(“Microsoft.XMLHTTP”);},
];
var xhr=null;
对于(var i=0;i
编辑:

在进一步更新之后,我成功地获得了以下错误:

无法加载XMLHttpRequest . 起源是 不允许 访问控制允许源

我上传了一个
crossdomain.xml
文件,允许从通配符(*)域进行访问。不确定如何继续

编辑:

在做了更多的调查之后,我开始认为JavaScript发布可能不可能到S3。在进行传输之前,我是否需要发布到EC2实例?我可能可以保护一个微实例,但如果可能的话,我更愿意直接到S3!谢谢

编辑:

我在亚马逊论坛上发布了这个问题,没有收到任何反馈。关于交叉引用,可以在这里找到另一个帖子:。

这意味着你必须用JavaScript公开你的S3凭据。你不希望这样

最好的解决方案是使用回形针。是的,你必须先上传到你的服务器,但至少它是安全的


尽管如此,请查看评论。

您需要提出另一方的问题。在您的情况下,另一方是Amazon S3服务器。除非他们在标题中提到您的域,否则您将无法向他们提出任何跨站点请求


您可以通过向存储桶中添加一个或多个CORS规则来配置任何S3存储桶以进行跨域访问。每个规则都可以指定一个应该可以访问您的存储桶的域和一组您希望允许的HTTP谓词。

我自己没有尝试过,但他们似乎在jquery-html5-upload插件中实现了这一点


S3可以用jquery托管html页面,没有问题。 bucket将成为服务器URL。 如果您使用S3 Bucket Explorer之类的工具,您可以在一次单击中获得Bucket中任何HTML页面的URL

然后,只需在XMLHttpRequest中使用PUT命令即可上载文件

这就是JQuery-HTML5-Upload插件在AmazonS3上的工作原理(见第12期)

事实上,您可以通过将AmazonS3RESTAPI语法插入变量,然后将其与XMLHttpRequest open()方法结合使用,来试验AmazonS3RESTAPI语法


多元宇宙中的和平。

亚马逊最终增加了对跨来源资源共享(CORS)的支持,这使得:


http://aws.typepad.com/aws/2012/08/amazon-s3-cross-origin-resource-sharing.html

今天,亚马逊宣布完全支持跨来源资源共享(CORS)在Amazon S3中。您现在可以轻松构建web应用程序,使用JavaScript和HTML5与Amazon S3中的资源进行交互,使您能够实现HTML5拖放上传到Amazon S3、显示上传进度或更新内容。

有一个很好的rails gem,它完全符合您的要求。它是一个HTML5/javascript uploader,支持重命名文件。

不,您不支持。Amazon支持HMAC SHA-2密钥编码和过期令牌。它们允许通过常规帖子直接上载()我只需要它是AJAX。太棒了。我不知道!是的,仍然不知道如何修复我的bug Ariejan。还有人知道吗?请参阅上面的帖子!感谢回复!你知道我是否可以在Amazon S3上设置响应
访问控制允许源代码
标题吗?@Kevin我一直在研究这个问题。Amazon S3不支持设置这个标题er关于桶或对象。有关更多信息,请查看此内容。根据亚马逊的(缺乏)回应,他们似乎对未来支持它没有任何兴趣。@Dan谢谢。我实际上是该线程上的“海报”,已经放弃了希望。CORS现在在S3上可用(被请求3.5年后!)