使用Heroku上的CarrierWave将上传的存档提取到S3

时间:2012-08-14 23:09:06

标签: ruby-on-rails heroku amazon-s3 carrierwave

我想做一些我认为简单的事情:

  • 有一个包含这些控件的表单:
    • 一个文件的文件上传
    • 复选框是否应提取此文件
    • 文本输入,我指定应链接到哪个文件(仅在选中复选框时才需要) - index_file
  • 提交表格后:
    • 如果未选中复选框,请将文件通过CarrierWave上传至S3至指定的store_dir
    • 如果选中 复选框,则从存档中提取所有文件(我只需要ZIP存档;我需要保留目录结构),将提取的文件上传到指定的store_dir和在数据库中设置index_file(我不需要将有关其他提取文件的任何内容保存到数据库中)

正如我所发现的,由于Heroku的限制,这不是一件容易的事。这些文件将具有较大的大小(数百个MiB或几个GiB),因此如果可能,我不想从S3重新下载此文件。

我认为使用延迟作业或Resque可能有效,但我不确定如何做到这一点以及解决问题的最佳解决方案。

有没有人知道如何使用尽可能最低的资源来解决它?如果在Heroku上无法使用,我可以将CarrierWave更改为另一个上传者(Paperclip等)和我的托管服务提供商。

我还在考虑使用CloudFlare,这仍然可以正常工作吗?

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

基于this heroku support email,似乎/ tmp目录的大小很多。你只需要自己清理,所以Heroku作为一个平台不是问题。

有几篇文章可以帮助您解决问题:

  1. https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Make-Carrierwave-work-on-Heroku - 解释了如何配置应用程序以将/ tmp目录用作CarrierWave的缓存目录。请注意以下几行:

    使用Rack :: Static,:urls => ['/ carrierwave'],:root => 'tmp'#添加这一行

    这指示机架从/ tmp目录提供/ carrierwave / xzy(暂时用于存储图像)

  2. 然后,使用uploader.cache! method,您可以故意缓存入站上传的文件。存储后,您可以进行检查以确定是否调用uploader.store! method将内容提升为S3(假设您将S3配置为CarrierWave的存储。