如何在Rails中使用Paperclip设置原始图片路径?

8

情况

我有一个简单的模型,使用Paperclip附加了一张图片,并为其创建了几个处理过的样式(缩略图、全尺寸、特征)。目前它按照预期工作,并在/public/assets/foo/中为每个对象创建一个目录结构,其中包含原始、缩略图、全尺寸和特征的子目录。

问题

我不希望用户获取原始(高分辨率)图像。因此,我希望有一种方法可以指定不同的路径来存储原始图像,以避免其位于/public/外。理想情况下,Paperclip仍应能够使用该原始图像作为源重新处理样式,就像当前所做的那样。

我也愿意接受其他建议,以使原始图像对外部用户无法访问。无论何种实用解决方案都可以。谢谢。


你能否在 has_attached_file 调用中简单地传递 :processors => [] 吗? - user211648
2个回答

22

我建议使用自定义插值,将原始文件放在公共目录之外。可以像这样实现:


Paperclip.interpolates :maybe_public do |attachment, style|
  style == :original ? "private" : "public"
end

has_attached_file :image, :path => ":rails_root/:maybe_public/:attachment..."

这将会把你的 :original 文件保存在不对外公开的目录下,以防止文件泄露,但仍允许 Paperclip 访问。同时,缩略图将保存在公开目录下供标准访问。


谢谢,这正是我想要的。实际上,我不得不从Github获取最新的Paperclip,因为我的过时版本还没有插值方法 :) - Michael Richards

0
如果可以的话,你可以通过设置默认样式来跳过保存原始内容。
  has_attached_file :image,
                    :styles => { :normal => "800x600>" },
                    :default_style => :normal

如果您不想删除原始文件,而且正在使用Apache服务器,您可以使用.htaccess文件来限制对原始文件目录的访问。
<FilesMatch "^\.(jpe?g|gif|png)$">
   Order allow,deny
   Deny from all
</Files>

2
我已经将:full设置为默认样式。它不会跳过保存原始数据,只是设置了@foo.image.url没有参数时的样式,默认为:original。这样你就不必一直用@foo.image.url(:full)来指定样式了。 - Michael Richards

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