Rails 4,Paperclip,Amazon S3 - 上传至特定文件夹

4
这是我第一次使用Paperclip和Amazon S3,我确信我错过了一些显而易见的事情。如果有人能指出来就太好了。
在S3存储桶中,我有两个文件夹,分别是developmentproduction,以便根据环境上传图片到相应的文件夹。我在我的model.rb中尝试了此处提供的解决方案(链接),代码如下:
options = {}

if Rails.env.production?
   options[:path] ||= 'production'
else
   options[:path] ||= 'development'
end

has_attached_file :picture, options

我一直在S3存储桶上传名为“development” / “production”的文件(如屏幕截图所示)。
我甚至尝试将:path作为paperclip的配置设置传递。同样的事情发生了-一个名为development / production的文件夹被上传。
我错过了什么吗?我想做的就是在开发环境中上传图片到开发文件夹,反之亦然。

尝试在production后面添加一个斜杠,例如 options[:path] ||= 'production/' - Yule
1个回答

5

路径选项需要同时指定文件模式。尝试这样做:

模型

has_attached_file :picture,
  :storage => :s3,
  :bucket => 'your_bucket',
  :path => ":env_folder/:attachment/:id/:style/:filename.:extension"

# some other model code here ...

private

# interpolate in paperclip
Paperclip.interpolates :env_folder  do |attachment, style|
  Rails.env.production? ? 'production' : 'development'
end

编辑

如果你只是将:path选项设置为“development”或“production”,那么你告诉Paperclip文件路径为yourbucket/development,这就是为什么你会看到单个文件,如你的截图所示。这就是为什么在:path选项中有必要使用某些唯一标识资源的内容(我在我的示例中使用了:id,它将使用模型的id属性)。

如果您有选择,我认为更好的方法是将环境分离到自己的桶中。换句话说,development环境将拥有自己的桶,而production将拥有自己的独立桶。不仅代码更清晰,而且在我的经验中,您还将能够为每个桶/环境设置不同的策略,这在应用程序发布到生产环境后是必需的。希望这可以帮助你。


我不明白为什么路径中需要有扩展名。我只想把所有的图片(jpg、png等)上传到S3桶中特定的文件夹里。路径基本上指定了S3存储桶内的文件夹结构,对吗? - Aswin Ramakrishnan
我同意将环境分开放入各自的存储桶中会使其更加清晰。但是由于S3非常流行,我想知道是否有更简单的方法来进行文件夹级别的分离。 - Aswin Ramakrishnan
1
@AswinRamakrishnan 我例子中的 :extension 仅用于说明目的,如果您不想将其作为 URI 的一部分,则可以省略它。 path 选项指定上传文件的路径,这就是为什么您不能像原始帖子中一样只使用 'production' 或 'development'。如果您只有 'development',那么上传文件的实际名称将是您附加的截图中的 'development'。 - Bart Jedrocha
1
@AswinRamakrishnan 关于流行度和S3存储桶必须是唯一的事实,我发现一个好的解决方案是使用应用程序名称对您的存储桶进行命名空间分隔。例如,myapp.prodmyapp.development - Bart Jedrocha
路径选项10-4!正如您所看到的-S3新手 :)我喜欢为存储桶选项命名空间。只是好奇-通过为存储桶命名空间,您是否获得任何应用程序级别的隔离?还是更多的约定事项? - Aswin Ramakrishnan
@AswinRamakrishnan 这只是一种惯例。如果您觉得有帮助,请接受我的答案。干杯。 - Bart Jedrocha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接