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

Ruby on rails 在多个Rails应用程序之间共享上载的文件,ruby-on-rails,file-upload,paperclip,file-sharing,Ruby On Rails,File Upload,Paperclip,File Sharing,我有多个应用程序(一个管理应用程序、“公共”/“非管理”应用程序和一个web服务应用程序),它们都共享一个数据库 我已经让应用程序在适当的地方共享模型和其他代码,所以我没有在每个应用程序中都有相同代码的多个副本。然而,我尚未配置的一项任务是如何在应用程序之间共享上传的文件。我正在使用将文件成功上载到我的应用程序,但如果它将文件上载到执行上载的应用程序 理想情况下,我希望能够从web服务提供所有文件。我的想法是,每次将新文件上载到任何应用程序时,我都需要执行某种类型的任务,以便在web服务的文件结

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

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

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

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

有人对实现这一目标的最佳方式有什么想法吗?还有更好的主意吗


提前感谢您对本主题的任何反馈。

您是否在同一UNIX/Linux系统上运行所有应用程序?您是否尝试创建符号链接以共享包含图像的文件夹?目标是将所有图像保存到同一位置。无需添加复杂的挂钩来创建附件

默认情况下,曲别针将东西存储在:rails\u root/public/system/:attachment/:id/:style/:filename处。如果共享数据库,则无需担心冲突。你只需要创建一个系统文件夹供每个应用程序使用

您可以使用一个应用程序的公用/系统文件夹作为主文件夹,也可以创建一个全新的主文件夹。从这一点开始,所有其他非主系统文件夹将被称为从属文件夹。选择主文件夹后,只需将每个从属文件夹中的所有内容移动到主文件夹即可。删除从属文件夹并将其替换为指向主文件夹的符号链接

给定回形针默认值,要迁移并替换为symlink的示例命令集。在尝试此操作之前,最好先停止服务器

$ 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

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

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

尽量不要错过这里显而易见的内容,但您是否表示您没有可供所有三个应用程序访问的共享文件系统?它们是需要通过身份验证进行保护的文件,还是可以从静态资产主机提供服务?除了应用程序本身可能提供的内容外,不需要身份验证。它们可以从静态资产主机提供服务,我想这正是我真正想要实现的。感谢Matt的输入。我认为这听起来是一个理想的解决方案,文件的URL会受到什么影响?我最终使用了这个解决方案。在浏览了回形针插件的源代码之后,我注意到您可以设置一个完全限定的域名作为附件的URL。我配置了一个从适当的环境配置文件加载的全局变量,以适当地设置域。谢谢你的建议,马特。