3

我在一个项目中使用 Dragonfly,该项目返回大量照片并希望优化 URL。我目前正在获取图像 URL,例如:

http://localhost:3000/media/BAhbCFsHOgZmSSJgZmRlL2ZkZTAxYzQ0LTM4Y2UtNGU0ZS1iOWRlLWUwZmUxNWUwN2JmMC83Mzk1NmZlMC05ZTA5LTQzNWUtODUyMC00MzFlYzQxMzQ1OTQvb3JpZ2luYWwuanBlZwY6BkVUWwg6BnA6CnRodW1iSSIMMjQweDI0MAY7BkZbCTsHOgxjb252ZXJ0SSIQLXF1YWxpdHkgODAGOwZGMA/240x240.jpg

超过 256 个字节。我想要类似的东西:

http://localhost:3000/media/1024/240x240_medium.jpg

这符合:

/media/:id/:format

:format当使用 Dragonfly 和 Rails 以映射到一系列操作并:id用于查找模型或图像时,我将如何添加它?谢谢!

编辑:

我已经Mime::Type为我需要的每种格式添加了自定义,并且有以下工作:

# config/routes.rb
match "/photos/:id/:style", to: "photos#show", as: :media

# app/controllers/photos_controller.rb
def show
  @photo = Photo.find(params[:id])

  respond_to do |format|
    format.html # show.html.erb
    format.jpg { cache('public', 86400); redirect_to @photo.url(params[:style], 'jpg') }
    format.png { cache('public', 86400); redirect_to @photo.url(params[:style], 'png') }
    format.gif { cache('public', 86400); redirect_to @photo.url(params[:style], 'gif') }
  end
end

# app/views/photos/show.html.erb
<%= image_tag media_path(id: @photo.id, style: 'small', format: 'png') %>

但是,这会导致302每个图像都有一个(但其他工作正常)。是否可以将其作为渲染处理或以某种方式进行内部重定向(即不需要客户端进行重复请求)?

4

2 回答 2

8

您不需要使用控制器操作 - 您可以使用蜻蜓端点 - 请参阅http://markevans.github.com/dragonfly/file.URLs.html#Routed_Endpoints

例如

match '/photos/:id/:style.:format' => Dragonfly[:images].endpoint { |params, app|
  Photo.find(params[:id]).image.thumb(params[:style]).encode(params[:format])
}

或类似的东西(没有尝试过上面的代码,但它会沿着这些线)

于 2011-08-18T23:00:15.143 回答
1

我遇到了类似的情况,客户需要一个简短的 url 来下载 pdf。

基于马克的回答并查看我想出的蜻蜓文档:

#file.rb
class File < ActiveRecord::Base
  dragonfly_accessor :pdf
end

def pdf_link
  return "/pdf/#{self.filename}.pdf"
end  

#routes.rb
get '/pdf/:filename' => Dragonfly.app.endpoint { |params, app|
  File.where(filename: params[:filename]).first.pdf
}

这不是问题的直接答案,但也许它仍然可以帮助寻找缩短蜻蜓网址的方法的人

于 2016-07-25T14:10:13.877 回答