`
jsntghf
  • 浏览: 2564685 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

自定义paperclip的上传路径

阅读更多

paperclip是一个不错的上传控件。尺寸、路径等在model中简单配置即可。

 

下面看一个简单的配置:

 

  has_attached_file :cover, :styles => { :medium => "130x95>", :small => "70x70>" },
    :path => ":rails_root/public/uploads/:class/:attachment/:id/:style/album_cover.:extension",
    :url => "/uploads/:class/:attachment/:id/:style/album_cover.:extension",
    :default_url => "/uploads/:class/:attachment/:style/photo_album_thumb.jpg"

 

类似:class、:attachment、:id、:style,这些都会自动取到相应的值进行填充。

 

接下来,看一下这些在paperclip中是如何实现的。

 

    def self.interpolations
      @interpolations ||= {
        :rails_root   => lambda{|attachment,style| RAILS_ROOT },
        :rails_env    => lambda{|attachment,style| RAILS_ENV },
        :class        => lambda do |attachment,style|
                           attachment.instance.class.name.underscore.pluralize
                         end,
        :basename     => lambda do |attachment,style|
          Iconv.iconv("GB2312", "UTF-8", attachment.original_filename.gsub(/#{File.extname(attachment.original_filename)}$/, ""))
                         end,
        :extension    => lambda do |attachment,style| 
                           ((style = attachment.styles[style]) && style[:format]) ||
                           File.extname(attachment.original_filename).gsub(/^\.+/, "")
                         end,
        :id           => lambda{|attachment,style| attachment.instance.id },
        :id_partition => lambda do |attachment, style|
                           ("%09d" % attachment.instance.id).scan(/\d{3}/).join("/")
                         end,
        :attachment   => lambda{|attachment,style| attachment.name.to_s.downcase.pluralize },
        :style        => lambda{|attachment,style| style || attachment.default_style },
      }
    end

 

这里面的占位符都是paperclip自带的。

 

那么,在model中指定路径时,我们想加入一些自定义的占位符,那该怎么办呢?

 

例如,我们想在路径中加入当天日期。

 

model中可以这样来配置:

 

  has_attached_file :cover, :styles => { :medium => "130x95>", :small => "70x70>" },
    :path => ":rails_root/public/uploads/:class/:today/:attachment/:id/:style/album_cover.:extension",
    :url => "/uploads/:class/:today/:attachment/:id/:style/album_cover.:extension",
    :default_url => "/uploads/:class/:attachment/:style/photo_album_thumb.jpg"

 

在这个路径中,:today占位符paperclip是不会识别的,所以,我们也得加一个关于:today占位符的实现。

 

最简单的方法是直接改paperclip中interpolations方法的@interpolations变量,在其中加入以下代码:

 

  :today => proc do
    Time.now.strftime("%Y%m%d")
  end

 

最后,重启服务即可。

 

不过,不建议这么做。

 

我们可以在控制器中或者其他地方加入以下这段来实现同样的功能:

 

Paperclip::Attachment.interpolations[:today] = proc do 
  Time.now.strftime("%Y%m%d")
end

 

如果想在路径中加入自定义的其他占位符,原理和这个类似,只需要修改自定义占位符的实现即可。

分享到:
评论
3 楼 zhanger 2012-12-07  
将时间按年,月,日拆分成三级之后,实际取到的变量值变成了一串很长的数字,没想明白其中原因,LZ分析下呗。
具体是在path中用了三个自定义变量:year,month,day
:path => ":rails_root/public/uploads/:class/:year/:month/:day/:attachment/:id/:style/album_cover.:extension",

三个变量的值如下:
Time.now.year.to_i
Time.now.month.to_i
Time.now.day.to_i
实际使用时用的附件的updated_at时间。
2 楼 jsntghf 2010-08-02  
jackdong 写道
  :today => proc do
    Time.now.strftime("%Y%m%d")
  end

已当前时间为占位符是问题滴, 文件保存时是已当前时间保存滴, 如果第二天去读取文件的时候today占位符对应的时间为当前时间, Time.now.strftime("%Y%m%d") 这个时间明显与数据库值不一样,因此就会找不到路径。 还是以updated_at时间为基准好

是的,我这个只是示例,实际做不会用这个时间的,可以用id之类的,参考这个就行了,改个实现而已。
1 楼 jackdong 2010-08-02  
  :today => proc do
    Time.now.strftime("%Y%m%d")
  end

已当前时间为占位符是问题滴, 文件保存时是已当前时间保存滴, 如果第二天去读取文件的时候today占位符对应的时间为当前时间, Time.now.strftime("%Y%m%d") 这个时间明显与数据库值不一样,因此就会找不到路径。 还是以updated_at时间为基准好

相关推荐

    rails上传文件_paperclip

    在Ruby on Rails框架中,Paperclip是一个非常流行的用于处理文件上传的库。它提供了一种简单而优雅的方式来管理和处理模型中的附件,如图片、文档等。Paperclip与ActiveRecord紧密集成,使得在Rails应用中添加文件...

    paperclip-s3:未维护

    如果您实际上正在使用 ,并且您想要附件具有自定义路径。 请不要使用RAILS_ROOT 。 为什么? 每一个当您将应用程序部署到,您正在更改RAILS_ROOT,因此您所有上传的文件都将丢失,您的存储桶将一团糟! 默认的...

    rails 多图上传.txt

    upload_url: "swfuploadfile.js", // 文件上传的后端处理路径 post_params: { "utf8": "✓", "authenticity_token": "<%= form_authenticity_token %>" }, // 上传请求携带的参数 file_size_limit: "100MB", ...

    Rails入门教程一(翻译).pdf

    此外,Rails提供了丰富的插件和gem(Ruby gem),例如Devise用于身份验证,CanCanCan处理授权,Paperclip或Carrierwave用于文件上传等,这些都能极大地增强应用的功能。 在开发过程中,Rails还提供了TDD(测试驱动...

    ruby on rails 安装手记

    最后,Rails社区非常活跃,有许多优秀的第三方gem库可以扩展Rails的功能,例如Devise用于用户认证,CanCanCan处理授权,Paperclip或Carrierwave处理文件上传等。通过`gem 'gem_name'`在`Gemfile`中添加gem,然后运行...

    ruby_on_rails_learning:我的RoR笔记本

    RoR的Gem生态系统非常丰富,如Devise用于用户认证,CanCanCan处理授权,Paperclip或CarrierWave用于文件上传,DelayedJob或Sidekiq实现后台任务队列等。这些Gem极大地扩展了RoR的功能,加速了开发进程。 在"ruby_on...

Global site tag (gtag.js) - Google Analytics