代码之家  ›  专栏  ›  技术社区  ›  Kevin Sylvestre

HTML 5 Amazon S3直接上载程序

  •  4
  • Kevin Sylvestre  · 技术社区  · 15 年前

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

    我正在运行RubyonRails,并希望为上传的文件分配一个临时名称(使用UUID),该名称将被发布回Web服务器,以便以后可以重命名该文件并与Paperclip集成。

    有什么想法吗?这是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文章对S3来说可能是不可能的。在进行传输之前,是否需要将我发布到EC2实例?我也许可以保护一个微实例,但如果可能的话,我更愿意直接访问S3!谢谢!

    编辑:

    我在亚马逊论坛上发布了这个问题,没有收到任何反馈。对于交叉引用,可在此处找到其他帖子: https://forums.aws.amazon.com/message.jspa?messageID=206650#206650 。

    7 回复  |  直到 12 年前
        1
  •  4
  •   sanmai    14 年前

    你需要解决另一个问题 an Access-Control-Allow-Origin header . 在您的情况下,另一方是AmazonS3服务器。除非他们在标题中提到你的域名,否则你将无法向他们发出任何跨站点请求。

    Amazon S3 now supports Cross Origin Resource Sharing 您可以通过向bucket中添加一个或多个CORS规则来配置任何S3 bucket以进行跨域访问。每个规则可以指定一个应该可以访问您的bucket的域和一组您希望允许的HTTP谓词。

        2
  •  4
  •   VAAA    14 年前

    今天,亚马逊宣布完全支持AmazonS3中的跨源代码资源共享(cors)。现在,您可以轻松构建使用javascript和html5与AmazonS3中的资源交互的Web应用程序,使您能够实现html5拖放上载到AmazonS3、显示上载进度或更新内容。

        3
  •  1
  •   Ariejan    15 年前

    这意味着您必须在JavaScript中公开您的S3凭证。你不想那样。

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

    但是,请检查评论。

        4
  •  1
  •   cary abramoff    15 年前

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

    然后,只需在xmlhttprequest中使用put命令即可上载文件。

    这就是jquery-html5-upload插件在AmazonS3上的工作原理(参见其问题12)。

    实际上,您可以尝试使用AmazonS3RESTAPI语法,只需将其插入变量中,然后将其与xmlhttpRequestopen()方法结合使用。

    多元宇宙的和平。

        5
  •  1
  •   Kevin Sylvestre    14 年前

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

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

        6
  •  0
  •   user537339    15 年前

    我自己也没试过,但他们似乎在jquery-html5-upload插件中有这个功能。

    http://code.google.com/p/jquery-html5-upload/issues/detail?id=12

        7
  •  0
  •   Zyren    12 年前

    有一个好的轨道宝石叫 s3_drect_upload 这正是你想要的。它是一个支持重命名文件的HTML5/javascript上传程序。