如何将CarrierWave文件迁移到新的存储机制?

mtj*_*hax 9 activerecord ruby-on-rails carrierwave

我有一个Ruby on Rails站点,其中模型使用CarrierWave进行文件处理,目前使用的是本地存储.我想开始使用云存储,我需要将现有的本地文件迁移到云端.我想知道是否有人可以指出这样做的方法?

使用模型属性的加分点,允许我在后台逐行执行此操作,而不会中断我的站点以延长停机时间(换句话说,某些模型行仍然具有本地存储,而其他模型行则使用云存储).

我的第一直觉是为每个使用云存储的模型创建一个新的上传器,所以我在每个模型上有两个上传器,然后将文件从一个传输到另一个,设置一个属性来指示应该使用哪个文件,直到它们全部转移,然后删除旧的上传者.这看起来有点过分了.

San*_*San 8

最小可能零Donwtime程序

在我看来,最简单,最快速的方法来实现您想要的几乎没有停机时间是这样的:(我将假设您将使用AWS云,但类似的程序适用于任何云服务)

  1. 找出并设置资产桶,存储桶策略等,以使资产可公开访问.
  2. 使用s3cmd(用于与S3交互的命令行工具)或GUI应用程序,将整个资产文件夹从文件系统复制到S3中的相应文件夹.
  3. 在您的应用中,设置carrierwave并更新您的模型/上传器以进行:fog存储.
  4. 不要重新启动您的应用程序.而是调出rails控制台和模型,检查新资产URL是否正确且可按计划访问.例如,对于带有图片资源的视频模型,您可以这样检查:

    Video.first.picture.url
    
    Run Code Online (Sandbox Code Playgroud)

    这将根据更新的设置为您提供完整的云URL.复制URL并粘贴到浏览器中,以确保您可以正常使用.

  5. 如果这适用于具有资产的每个模型的至少一个实例,则可以重新启动应用程序.

  6. 重新启动后,您的所有资产都将通过云提供,并且您的模型中不需要任何迁移或多个上传程序.

  7. (基于@Frederick Cheung的评论):使用s3cmd(或类似的)rsyncsync从文件系统到S3的资产文件夹来说明在步骤2和5之间上传的资产(如果有的话).

PS:如果您需要帮助为云存储设置carrierwave,请告诉我们.


Evo*_*o_x 5

我会尝试以下步骤:

  1. 将上传器中的存储更改为 :fog 或您想要使用的任何内容
  2. 编写一个迁移,比如rails g migration MigrateFiles让 Carrierwave 获取当前文件,处理它们并上传到云端。

如果您的模型如下所示:

class Video
  mount_uploader :attachment, VideoUploader
end
Run Code Online (Sandbox Code Playgroud)

迁移看起来像这样:

@videos = Video.all
@videos.each do |video|
  video.remote_attachment_url = video.attachment_url
  video.save
end
Run Code Online (Sandbox Code Playgroud)

如果执行此迁移,将会发生以下情况:

Carrierwave 会下载每个图像,因为您为附件指定了远程 URL(当前位置,例如http://test.com/images/1.jpg),并将其保存到云端,因为您在上传器中更改了该 URL。

编辑:

由于 San 指出这不会直接起作用,您可能应该首先创建一个额外的列,运行迁移以将所有视频中的当前attachment_urls复制到该列中,之后更改上传者并使用其中复制的url运行上述迁移新专栏。进行另一次迁移时,只需再次删除该列即可。不是那么干净和容易,但几分钟内就完成了。