2016-01-24 93 views
2

我有一个使用carrierwave和亚马逊s3图像上传的rails 4应用程序。我还有一个为我的移动应用程序构建的休息API,可以与数据库交谈。Rails应用程序和Android应用程序连接到S3存储桶

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

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

  1. android应用程序将图像直接发送到网站使用的相同亚马逊s3存储桶,然后发送一个post请求到存储图片url的rails应用程序。
  2. android应用程序通过发布请求发送整个图像,并且rails应用程序处理其他所有内容(存储路径并将图像发送到亚马逊桶)。

想得到一些有关如何做到这一点的最佳方法的反馈意见 - 或者完全是另一种方式。对于apis来说还是个新鲜事物,并且拥有一个网络应用程序和移动应用程序。如果您已经了解关于此主题的文档,请告诉我。日Thnx!

回答

3

第二个选项对我来说更容易。

第一个选项依赖于移动设备来保持数据的一致性,这在实践中非常困难---或许“不可能”,至少不可靠。移动设备在任意时间丢失连接,并且在S3上传和API调用之间发生时,一致性将丢失。对于目标应用程序而言,这种一致性可能并不重要(这取决于您对API所做的操作),但它通常是一个重要属性,仅用于了解系统状态以及调试时的情况。将S3存储委托给API可将一致性问题转移到单点,通信更可靠。

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

另一个优点是安全性。 API成为唯一可以写入权限的可信任方。所有移动设备都拥有只读权限。方式更容易管理并保证一定程度的安全性。更别说安全问题了,代码中的一个错误可能会让某些设备覆盖别人的图像。

分析也可以通过API进行更全面或更细致的分析。

我相信还有一些其他的好处,我不记得,还有一些问题,如潜在的瓶颈/单点故障。总体而言,第二种选择对我来说是您呈现条件的最佳选择。

+1

感谢您的详细回复。将采取这条路线。 – Kathan

1

我推荐你第一个选择。 有两个原因:

  1. Carrierwave uploades图像,并在同一时间节省模型数据库。 这意味着如果您不通过载波上传图像,carrierwave将在保存模型时再次上传图像。

  2. 当图片上传时,Carrierwave会根据您的carrierwave设置命名图片。我可以想象你会设置随机名称以保持独特。所以你需要通过载波来获取图像名称。

所以我相信如果你选择另一个选项,它会很难。