Rails:允许用户将图像上传到Dropbox链接文件夹或Amazon S3上的"我们的"存储的最佳方式

And*_*s H 8 ruby-on-rails amazon-s3

我正在开发一个用户加入"流"的项目.在流设置期间,创建流的人(流创建者)可以选择:

  1. 将成员添加到流中的所有照片上传到我们的托管解决方案(S3)
  2. 将成员添加到流中的所有照片上传到流创建者自己的Dropbox身份验证文件夹

在未来我想添加更多存储提供商(如Drive,Onesky等)

关于如何解决这个问题,我有几个不同的问题.

  1. 照片数据库中的结构应该是什么?我目前只有photo_url,但从数据角度来看,使用预先签名的网址以及上传照片的方式不同(s3,dropbox等)并不容易管理
  2. 应如何存储每个存储提供程序的访问令牌?请记住,只会存储流创建者的access_token,并且流上的所有人都会在上传照片时共享该令牌
  3. 我将在未来添加iOS和Web客户端,直接上传到存储提供程序并绕过服务器以避免服务器上的负载过重

Sam*_*man 1

就数据库存储而言,您的应用程序应该根据您向用户和流呈现的界面来规定结构。如果您让用户上传照片,但他们无法选择 URI,并且您的流中没有任何层次结构,那么我建议您在主照片表中仅存储一个 ID 和一个stream_id。

所以至少你可能会有类似的东西

create table photos(id integer primary key, stream_id integer references streams(id) not null);
Run Code Online (Sandbox Code Playgroud)

但您可能还需要独立于存储的描述和其他信息。

流表将具有有关流的所有通用信息,但将具有与依赖于流类型的类的多态关联。因此,您可以使用该关联根据实际使用的流来获取 S3Stream 或 DropBoxStream 的实例。该实例(也是 ActiveRecord 资源)可以存储访问密钥以及诸如保管箱之类的文件夹路径等。此外,该实例可以提供在给定 Photo 对象的情况下构造 URI 的方法。如果特定技术需要缓存签名的 URI,则可以说 S3Stream 对象可以引用对 URI 进行签名的 S3SignedUrl 模型。如果事实证明 DropBox 和 S3 之间的签名 URL 代码相似,那么您可能有一个 SignedUrl 模型。

当您设计 ios 和 android 客户端时,至关重要的是不要授予它们对流所有者的访问令牌的访问权限。相反,您需要在服务器应用程序内完成所有签名。您不希望设备受到损害而导致访问令牌暴露,从而造成计费问题以及隐私暴露。希望这可以帮助。