在多个Rails应用程序之间共享上载的文件

时间:2009-12-07 14:29:31

标签: ruby-on-rails file-upload paperclip file-sharing

我有多个应用程序(管理应用程序,“公共”/非管理应用程序和Web服务应用程序),它们共享一个数据库。

我已经让应用程序在适当的时候共享模型和其他代码,因此我没有在每个代码中使用相同代码的多个副本。但是,我尚未配置的一项任务是如何共享在应用程序之间上传的文件。我正在使用Paperclip将文件成功上传到我的应用程序,但是如果它将文件上传到执行上传的应用程序。

理想情况下,我希望能够提供来自Web服务的所有文件。我的想法是,每次将新文件上传到任何应用程序时,我都需要执行某种类型的任务,以便在Web服务的文件结构中创建文件。

我知道如果我将文件加载到数据库中(这是我在类似的应用程序套件中完成此操作的方式),我可以轻松地从单个应用程序中完成服务文件,但我不确定这是否是最好的路径用于管理/提供文件。我的另一个想法是将文件存储在数据库中,让Web服务管理“服务”它们并让它在第一次请求时在磁盘上创建文件。在第一次请求文件之后,Web服务将从磁盘而不是从数据库提供文件。

有没有人对实现这一目标的最佳方法有什么想法?或者更好的想法?

提前感谢任何人对此主题的任何反馈。

2 个答案:

答案 0 :(得分:3)

如果您有这种设置,我建议将它们放在由您的前端网络服务器(而不是Rails)直接提供的共享位置,在此示例中,它将提供一个名为文件的位置,该文​​件位于文件夹上磁盘。然后在回形针选项中,更改保存位置。

has_attached_file :image,  
   :url => "/files/:basename.:extension",  
   :path => "/var/htdocs/public/files/:basename.:extension" 

答案 1 :(得分:0)

您是否在同一UNIX / Linux系统上运行所有应用程序?您是否尝试过创建符号链接来共享包含图像的文件夹?目标是将所有图像保存到同一位置。消除了为附件创建引入复杂钩子的需要。

Paperclip默认存储在:rails_root / public / system /:attachment /:id /:style /:filename如果您正在共享数据库,则不必担心冲突。您只需要创建一个系统文件夹供每个应用程序使用。

您可以使用一个应用的公共/系统文件夹作为主文件夹,或创建一个全新的文件夹。从这一点开始,所有其他不是主系统的系统文件夹将被引用到从属文件夹。一旦选择了master,就像将每个slave文件夹中的所有内容移动到master文件夹一样简单。删除从属文件夹并将其替换为主文件夹的符号链接。

在给定回形针默认值的情况下,将示例命令设置为使用符号链接进行迁移和替换。在尝试此操作之前停止服务器可能是个好主意。

$ mv /path/to/slave/project/public/system/* /path/to/master/system
$ mv /path/to/slave/project/public/system.bak
$ ln -s /path/to/master/system /path/to/slave/project/public/system

一旦确定迁移成功,您就可以删除备份:

$ rm /path/to/slave/project/public/system.bak