Rails应用程序和Android应用程序连接到s3存储桶

时间:2016-01-24 02:52:38

标签: android ruby-on-rails ruby amazon-web-services amazon-s3

我有一个rails 4应用程序,它使用carrierwave和Amazon s3进行图像上传。我还为我的移动应用程序构建了一个rest api来与数据库通信。

通过应用程序处理图像存储的最佳方式是什么(这样他们的网站和应用程序保持一致)?

现在,我正在考虑两种选择之一。

  1. Android应用程序将图像直接发送到网站使用的同一个亚马逊s3存储桶,然后向rails应用程序发送一个帖子请求,并将图像网址存储起来。
  2. Android应用程序通过发布请求发送整个图像,rails应用程序处理其他所有内容(存储路径并将图像发送到亚马逊存储桶)。
  3. 会喜欢一些有关最佳方法的反馈 - 或者是否还有另一种方法。对api来说仍然是新手,并且有一个网络应用和移动应用通信。如果您已经知道有关此主题的文档,请告诉我们。日Thnx!

2 个答案:

答案 0 :(得分:3)

第二种选择对我来说更容易下注。

第一种选择依靠移动设备来保持数据的一致性,这在实践中非常困难 - 好吧,也许“不可能”,至少是不可靠的。移动设备在任意时间失去连接,并且当它在S3上载和API调用之间发生时,一致性会丢失。对于目标应用程序而言,这种一致性可能并不重要(它取决于您对API的操作),但它通常是一个必不可少的属性,只是为了知道系统状态是什么,以及何时进行调试。将S3存储委托给API可将一致性问题转移到单点,通信更可靠。

第二种选择提供额外的优势。通过您的“专有”API,您使用的实际存储无关紧要。今天是S3,但明天的定价可能会引导你到另一个后端。在抽象存储细节的API背后,您可以随时随地进行更改。

另一个优点是安全性。 API成为唯一具有写访问权限的可信方。所有移动设备都只具有只读权限。更容易管理和保证一定程度的安全性。更不用说安全问题,代码中的错误可能会让某些设备覆盖其他人的图像。

通过API,Google Analytics也可以更全面或更细粒度。

我相信还有一些我不记得的好处,还有一些问题,比如潜在的瓶颈/单点故障。总的来说,第二个选择对我来说是你提出的条件的最佳选择。

答案 1 :(得分:1)

我建议你先选择。 有两个原因:

  1. Carrierwave上传图像并同时将模型保存到数据库。 这意味着如果您在没有通过carrierwave的情况下上传图像,则在保存模型时,carrierwave将再次上传图像。

  2. Carrierwave会在上传图片时按照您对carrierwave的设置命名图片。我可以想象你会设置随机名称以保持唯一。因此,您需要通过carrierwave获取图像名称。

  3. 所以我相信如果你选择其他选择,那就很难了。