让Rails'image_tag'浏览/ public文件夹外的图像?

时间:2011-01-07 21:24:09

标签: ruby-on-rails-3 heroku paperclip

我正在尝试将Paperclip与Heroku一起使用。是的,根据Heroku's Application Constraints。我只能将上传的文件存储到/ tmp或/.log文件夹中,该文件夹完全位于/ public文件夹之外。

如果我们不打算讨论Amazon S3 ,如何使用 image_tag 标记访问/ tmp目录中的图像。

这是我的照片模型,使用Paperclip

class ObbProductphoto < ActiveRecord::Base
belongs_to :product

has_attached_file :photo, :styles => {:high => '1024x768', :medium => '640x480', :thumb => '100x100'},
:path => "tmp/:id.:extension",
:url => "tmp/:id.:extension"
end

这就是我在浏览器中得到的:

<img src="/images/tmp/24.JPG?1294433924" alt="24" />

它仍然使用/ images文件夹,

我试图破解任何 / .. ../ ,无法获得解决方案。

谢谢你们, Suebphatt

2 个答案:

答案 0 :(得分:2)

假设可以将文件放在比/ tmp更永久的位置,可以使用:url和:path参数存储和访问public目录之外的上传文件,以及一点配置工作。

从我最近编写的代码中提取的一个示例(如果你逐字复制,它已被修改得足以使它可能无法工作):

app/models/picture.rb
  # Define the attachment
  has_attached_file :image,
                    :styles => {:large  => ["700",      :jpg],
                                :thumb  => ["100x100>", :gif]},
                    :url => "/asset/picture/:id/:style/:basename.:extension",
                    :path => ":base/picture/:id/:style/:basename.:extension"

config/initializers/storage.rb
  # Configure common attachment storage
  # This approach allows more flexibility in defining, and potentially moving,
  # a common storage root for multiple models.  If unneeded, just replace
  # :base in the :path parameter with the actual path
  Paperclip.interpolates :base do |attachment, style|
    /path/to/persistent/storage
    # A relative path from the Rails.root directory should work as well
  end

app/controllers/pictures_controller.rb
  # Make the attachment accessible
  def asset
    instance = Picture.find(params[:id])
    params[:style].gsub!(/\.\./, '')
    #check permissions before delivering asset?
    send_file instance.image.path(params[:style].intern),
              :type => instance.image_content_type,
              :disposition => 'inline'
  end

config/routes.rb
  # Add the necessary route
  match '/asset/picture/:id/:style/:basename.:extension', :to => 'pictures#asset'

app/views/pictures/show.html.erb
  <% # Display the picture %>
  <%= image_tag picture.image.url(:large) %>

注意这是所有Rails 3语法。在Rails 2.x中使用它需要进行一些更改,但希望你能得到这个,嗯,图片。

答案 1 :(得分:0)

据我所知,你不能 - /tmp没有被配置为可以提供项目的东西(它用于临时存储)。

您可以通过浏览器中的/tmp网址访问图片吗?他们有用吗?