使用 Javascript 或 Jquery 在 S3 上保存数据

Posted

技术标签:

【中文标题】使用 Javascript 或 Jquery 在 S3 上保存数据【英文标题】:Save data on S3 using Javascript or Jquery 【发布时间】:2011-06-25 18:48:02 【问题描述】:

我想收集用户在浏览器中输入的数据并保存到 Amazon S3。这是我可以用 javascript/Jquery 做的吗?

【问题讨论】:

感谢您的回答,但我将继续使用亚马逊网络服务来存储数据。现在这看起来是我最好的选择。干杯 【参考方案1】:

我知道这是一个老问题,但我遇到了同样的问题,并认为我找到了解决方案。 S3 有一个REST interface,您可以直接向其发布数据,而不会暴露您的 AWS 密钥。因此,您可以使用 Javascript 或 jQuery 向您的 S3 存储桶端点构建 AJAX POST 请求。您也可以在请求中指定访问策略,将上传访问权限限制为仅对某些存储桶和某些目录。

亚马逊使用您在请求中提供的 HMAC 签名来验证您的请求的真实性。签名是使用有关请求的详细信息和您的 AWS 密钥构建的,只有您和亚马逊知道,因此在没有有效签名的人的情况下无法发出欺诈性请求。

【讨论】:

谢谢丹,很高兴知道。我最终从 S3 提供了我的 javascript 小部件,然后使用 easyxdm 将跨域发布到我的 Web 服务器以存储信息。【参考方案2】:

是的,这是可能的,正如我已经在接受答案的 cmets 中指出的那样,在不损害安全性和凭据的情况下,这样做有合法和有用的用途。

您可以直接从浏览器将对象发布到 S3: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectPOST.html

【讨论】:

【参考方案3】:

坏主意:

1) 想想当人们发现您的 S3 凭据嵌入在您的 Javascript 代码中时,清空您的银行帐户会有多有趣。

2) javascript 将从您的服务器加载并尝试与亚马逊的服务器通信 - 这是禁止的,因为它是跨域通信。

你想在服务器上处理这样的事情。您可以轻松地创建一个 AJAX 接口来发送数据client browser -> your server -> amazon。这样一来,您的 S3 凭据就会存储在您的服务器上,而不会随意传输给使用您网站的每个人。

【讨论】:

是否可以将信息传递给在 S3 或亚马逊服务上运行的 javascript?关于第 2 点,可以从 S3 提供 javascript 吗? Javascript 通常是一种客户端语言。它没有本机数据库功能,因此您不能使用它(例如)与 mysql 对话。我确信它可以提供,但我对 S3 了解不多,所以不能肯定。 是的,我是专门询问 S3 的,不用担心其他人可以参与进来。干杯 投了反对票,因为它只是给出个人意见而没有回答问题。一个有用的客户端 javascript 直接访问 S3 的示例将是一个简单的 js 应用程序,每个用户都可以使用其凭据将图片上传到 S3。它是安全的,因为它是他的凭据,它是安全的,因为他不会将凭据提供给其他任何人。 投反对票,因为解决方案客户端浏览器>服务器>亚马逊不是问题所寻求的......这样你将在服务器端使用无用的带宽(可能不在亚马逊数据中心)和更多的时间来完成操作。而且,正如 Dan 和 Stefan 在下面的答案中所说,有一种方法可以在不暴露密码的情况下启用对 Amazon 的 HTTP POST。【参考方案4】:

也许看看 node.js,并通过以下方式尝试 aws-sdk 包:

npm install aws-sdk

我找到了关于如何将文件上传到 S3 的博客和文档:

this blog. 和 aws doc.

【讨论】:

【参考方案5】:

尝试通过客户端代码访问 S3 存在各种问题:

无法保护您的凭据。 很多响应都是用 XML 而不是 JSON,JavaScript 中的 XML 解析引擎又重又慢。 对请求进行身份验证需要 HMAC-SHA1 的 JavaScript 实现。 在不通过代理路由的情况下从 JavaScript 发出跨域请求会出现问题。

总而言之,目前对于客户端 JavaScript 没有可行的解决方案。如果您对服务器端 JavaScript 感兴趣,可以在 GitHub 上为 Node.js 提供一些 S3 类。

【讨论】:

感谢 Skyler - 我慢慢开始对 S3 有了更多了解。目前,客户可以在他们的页面中将脚本引用添加到我在 S3 上的 js 中,这可以正常工作。但我希望他们能够单击一个按钮并让 js 向我发送数据。我现在认为最好在我的网站上设置一个 Web 服务并让 js 调用它。你能看到任何跨域问题吗? 正如我在回答中提到的,有一种方法可以通过为每个请求创建一个唯一的签名签名来验证请求,然后将其包含在直接发送到 S3 的 POST 请求中。签名可以由您的服务器生成,因此客户端不需要 HMAC 实施,并且您的 AWS 凭证保持安全。

以上是关于使用 Javascript 或 Jquery 在 S3 上保存数据的主要内容,如果未能解决你的问题,请参考以下文章

javascript 使用jQuery或javascript在鼠标悬停(鼠标悬停/鼠标移出)中添加或删除类

如何在javascript或jquery中使用变量作为数组键[重复]

在 jquery 或 javascript 中使用 bcrypt()

使用 Jquery 或 Javascript 保存数据

使用 JavaScript 或 jQuery 检测哪个表单输入具有焦点

当您使用 javascript 或 jquery 将鼠标悬停时,如何使图像或按钮发光?