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

paperclip定制文件名

阅读更多
在新项目中使用了paperclip这个文件上传插件,一切都很满意,但是对于它不能自定义文件名就比较郁闷了,一直想实现这个功能,不过一直没时间去看paperclip的源代码(其实因为懒)。

我说的自定义文件名,不是网上多数教程所说的修改文件存储的文件夹路径,打个比方,我上传了一个叫做 test.gif 的文件,服务器上存储的文件的文件名同样是 test.gif ,而我希望是系统随机地指定一个文件名给上传的文件,我希望在服务器上存储的文件名不是原来的 test.gif,而是 2010070100000.gif 这种由我指定的文件,这样可以统一文件,防止用户上传的文件是一些乱七八糟的名字,而且我们的项目面向中英文用户,当然是不希望英文用户看到一些中文名字的文件。

废话说完,上代码。
这个代码不是我写的,在网上看到的,原文链接 http://trevorturk.com/2009/03/22/randomize-filename-in-paperclip/

在需要上传文件的model中加入如下代码:
before_create :randomize_file_name

  private
  def randomize_file_name
    #archives 就是你在 has_attached_file :archives 使用的名字
    extension = File.extname(archives_file_name).downcase
   #你可以改成你想要的文件名,把下面这个方法的第二个参数随便改了就可以了。
    self.archives.instance_write(:file_name, "#{Time.now.strftime("%Y%m%d%H%M%S")}#{rand(1000)}#{extension}")
  end


代码一目了然,原理就是在保存之前,先把文件名给改了,简单直接。

paperclip 这个文件上传插件比起 file_column要好用得多,而且 file_column 已经多年没有更新了,推荐大家使用 paperclip。

另外,如果你使用jQuery的话,配合 jQuery Multiple File Upload Plugin 这个插件,相当的好用。 http://www.fyneworks.com/jquery/multiple-file-upload/
分享到:
评论
8 楼 wozhidao 2011-08-24  
这个方法有个很大的bug,远程图片的时候是取不到扩展名的,上传的图片是没有扩展名的
ruby-1.9.2-p290 :007 > file = "http://5433.com/images/ad/5173.jpg?1314083389"
 => "http://5433.com/images/ad/5173.jpg?1314083389" 
ruby-1.9.2-p290 :008 > file = open(img)
 => #<File:/tmp/open-uri20110824-16514-1w7gpmt> 
ruby-1.9.2-p290 :009 > File.extname(file)
 => "" 
7 楼 木剑先生 2010-07-04  
yangzhihuan 写道
木剑先生 写道
如果有N多model需要使用随机文件名,你所有的MODEL都要这么改

可以修改paperclip插件下lib/paperclip/attachment.rb

在assign(upload file)方法中有一个instance_write(:file_name,"#{Time.now.strftime("%Y%m%d%H%M%S")}#{rand(1000)}#{extension}")

这样就一劳永逸了


我个人不太喜欢直接修改插件的源代码(除非有bug)。如果所有的model都使用随机名的话,我目前使用的是继承(项目需求是这样),所以要上传文件的model都继承自 Attachment 类,这样只要改 Attachment 就可以了。当然这是由我项目需要决定的。

比较通用的做法是这样:
module AbstractAttachment
  def self.included(model)
    model.before_create :randomize_file_name  
  end

  private  
  def randomize_file_name  
    #archives 就是你在 has_attached_file :archives 使用的名字  
    extension = File.extname(archives_file_name).downcase  
   #你可以改成你想要的文件名,把下面这个方法的第二个参数随便改了就可以了。  
    self.archives.instance_write(:file_name, "#{Time.now.strftime("%Y%m%d%H%M%S")}#{rand(1000)}#{extension}")  
  end
end  


然后在所有要使用这个功能的model加上一句:
class Attachment
  include AbstractAttachment
end


个人以为这样比改插件的源代码要好。



写到module里也可以。。根据项目而定。。
6 楼 yangzhihuan 2010-07-03  
fireflyman 写道
yangzhihuan 写道
@fireflyman 你真是热情如火啊,太感谢了。

我用paperclip已经一段时间了,基本的用法还是会的,不过就是没有深入研究。

昨晚看到你的新帖,一下子興起就回了....哥們我班門弄斧了...嘻嘻


我以前一直是使用file_column这个插件的,也没想过要换其它,不过file_column实在是太旧了,最新的代码还是2008年提交的,这次上Rails 3就把file_column给换掉了,我没有paperclip的使用经验,所以你的经验之谈绝对不是班門弄斧。
5 楼 yangzhihuan 2010-07-03  
木剑先生 写道
如果有N多model需要使用随机文件名,你所有的MODEL都要这么改

可以修改paperclip插件下lib/paperclip/attachment.rb

在assign(upload file)方法中有一个instance_write(:file_name,"#{Time.now.strftime("%Y%m%d%H%M%S")}#{rand(1000)}#{extension}")

这样就一劳永逸了


我个人不太喜欢直接修改插件的源代码(除非有bug)。如果所有的model都使用随机名的话,我目前使用的是继承(项目需求是这样),所以要上传文件的model都继承自 Attachment 类,这样只要改 Attachment 就可以了。当然这是由我项目需要决定的。

比较通用的做法是这样:
module AbstractAttachment
  def self.included(model)
    model.before_create :randomize_file_name  
  end

  private  
  def randomize_file_name  
    #archives 就是你在 has_attached_file :archives 使用的名字  
    extension = File.extname(archives_file_name).downcase  
   #你可以改成你想要的文件名,把下面这个方法的第二个参数随便改了就可以了。  
    self.archives.instance_write(:file_name, "#{Time.now.strftime("%Y%m%d%H%M%S")}#{rand(1000)}#{extension}")  
  end
end  


然后在所有要使用这个功能的model加上一句:
class Attachment
  include AbstractAttachment
end


个人以为这样比改插件的源代码要好。
4 楼 木剑先生 2010-07-03  
如果有N多model需要使用随机文件名,你所有的MODEL都要这么改

可以修改paperclip插件下lib/paperclip/attachment.rb

在assign(upload file)方法中有一个instance_write(:file_name,"#{Time.now.strftime("%Y%m%d%H%M%S")}#{rand(1000)}#{extension}")

这样就一劳永逸了
3 楼 fireflyman 2010-07-03  
yangzhihuan 写道
@fireflyman 你真是热情如火啊,太感谢了。

我用paperclip已经一段时间了,基本的用法还是会的,不过就是没有深入研究。

昨晚看到你的新帖,一下子興起就回了....哥們我班門弄斧了...嘻嘻
2 楼 yangzhihuan 2010-07-03  
@fireflyman 你真是热情如火啊,太感谢了。

我用paperclip已经一段时间了,基本的用法还是会的,不过就是没有深入研究。
1 楼 fireflyman 2010-07-02  
paperclip不是早就开始用了吗?今天刚好也在搞文件上传,不过是用fleximage上传....下面有些paperclip的资料,分享下咯....

(1)Paperclip 简单教程
http://cn.asciicasts.com/episodes/134-paperclip
这是官方的视频教程,不过不是很全

(2)利用paperclip实现图片上传
http://www.cnblogs.com/rubylouvre/archive/2009/07/21/1527505.html
而司徒正美这个就详细很多了

(3)Rails文件上传利器——paperclip笔记
http://yuan.iteye.com/blog/604174
圆圆也写过这方面的笔记

(4)利用paperclip实现图片上传
http://www.pin5i.com/showtopic-24987-2.html
如果没作相关设置的时候,会使得在编辑上传的图片时无法删除硬盘上的图片,这里有相关的解决方法.

(5)rails3上安装paperclip
http://chinaonrails.com/topic/view/4030.html
rails3终究要来的...这里有相关办法

相关推荐

    paperclip模板

    Paperclip - Responsive Professional Theme for Business Projects and Mobile Apps Perfect for business and personal use Built with LESS Looks great on all major browsers, tablets and phones 21 unique ...

    rails上传文件_paperclip

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

    paperclip-av-transcoder, 使用 ffmpeg/avconv的Paperclip 音频/视频转码器.zip

    paperclip-av-transcoder, 使用 ffmpeg/avconv的Paperclip 音频/视频转码器 Paperclip 转码器使用 ffmpeg/avconv的Paperclip 音频/视频转码器。这是( https://github.com/owahab/paperclip-ffmpeg )的替代品。状态

    paperclip-storage-encrypted_filesystem:使用常规文件系统存储提供程序和 ActiveRecord 通过自动附件加密扩展 Paperclip

    您的 Paperclip 模型将需要两个额外的二进制列: paperclip_encryption_key和paperclip_encryption_iv来存储加密机密。 class AddPaperclipEncryptionKeyAndPaperclipEncryptionIvToMyModel &lt; A

    Rails的文件附件扩展Paperclip.zip

    Paperclip 是 Rails 框架的一个插件,用于扩展 ActiveRecord 以支持简单的文件附件的功能。 标签:Paperclip

    paperclip

    回形针 回形针旨在用作ActiveRecord的简单文件附件库。 其目的是使设置尽可能简单,并尽可能将文件与其他属性一样对待。 这意味着它们不会保存到磁盘上的... Paperclip现在需要Ruby版本&gt; = 2.0.0和Rails版本3.2,&gt; =

    paperclip_torrent:生成一个.torrent文件以补充您的回形针上传

    gem 'paperclip_torrent', github: "fattymiller/paperclip_torrent" 在模型中,正常设置has_attached_files ,包括:torrentify处理器,如下所示: has_attached_file :attachment, { styles: { audio_128kbps_...

    paperclip_watermark:回形针处理器在图像上应用水印

    回形针水印描述这是一个简单的 Paperclip 处理器,用于在 Paperclip 的图像上应用水印。 水印将调整大小以适合基本图像。 很少有选项可用于指定位置和不透明度: watermark_distance_from_top : 以百分比指定从顶部...

    paperclip-optimizer:缩小回形针图像上传

    回形针优化器不再维护PaperclipOptimizer 由于不推荐使用Paperclip,该宝石也已经达到使用寿命。 可以在以下位置找到Paperclip以及PaperclipOptimizer的保养好的货叉: PaperclipOptimizer是一个处理器,用于优化和...

    1.12.2paperclip.jar

    大家对服务端应该都不陌生了,我就不多介绍了,主要是点击server.jre,需要用JAVA8 64位运行,然后稍等一会,会生成mod文件夹,运行配置同意elua协议就可以开服务器了

    paperclip-s3:未维护

    gem “paperclip-s3” 并运行bundle install 。 然后,您需要设置一些ENV变量。 您需要提供一个秘密键,访问键和存储桶。 可以为用户提供access_key_id的s3_credentials哈希选项和相反,使用secret_access_key 。 ...

    1.16.5-paperclip.jar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...

    paperclip_database_attachments_responder:对 paperclip_database gem 的扩展

    综合解决方案请查看我的paperclip_database分支,并将此解决方案集成到:。安装由于 PaperclipDatabaseAttachmentsResponder 覆盖了 paperclip_database 的内部 api,因此使用精确的'2.2.1'版本。 将这些行放入您的...

    administrate-field-paperclip:用于管理的回形针字段插件

    将administrate-field-paperclip clipclip和kt-paperclip paperclip添加到您的Gemfile中: gem 'administrate-field-paperclip' gem 'kt-paperclip' 安装: $ bundle install 用法 按照上的开始使用模型和迁移。...

    paperclip-s3-tutorial-korean:回形针文件上传到 s3 韩文

    gem ' paperclip ' 并运行 bundle install 创建 s3 这里 设置s3信息 从获取访问密钥和秘密密钥并将它们写好。 然后创建一个config/aws.yml文件 development: & default access_key_id: ' YOUR_ACCESS_KEY ' ...

    dm-paperclip:Thoughtbot的Paperclip插件的DataMapper端口

    DM-Paperclip是Thoughtbot的Paperclip插件的端口,可与DataMapper一起使用。 该插件与原始的面向ActiveRecord的回形针完全兼容。 您可以采用现有的ActiveRecord数据库并将其与DataMapper一起使用。 该模块还包括...

    paperclipfans:Hi〜这里是回形针PaperClip非官方的资料整理仓库,我们迫切的希望您的帮助整理,这将加速我们的网站维护每一期的文字稿及图片内容

    氦,这里是回形针PaperClip内容收录仓库,你可以在这里找到往期节目的相关内容。 使用 在线浏览 目前,我们有以下站点供您在线浏览本仓库的内容。 GitHub页面 该站点由GitHub Actions自动构建并部署在GitHub Pages...

    mongoid-paperclip:蒙古族

    Rails.root / app / models / user.rb-包含Mongoid :: Paperclip模块并调用提供的类方法class User include Mongoid :: Document include Mongoid :: Paperclip has_mongoid_attached_file :avatarend就是这样那...

    paperclip-开源

    【Paperclip 开源项目详解】 Paperclip 是一个开源的实用工具,它的主要功能是监控和解析用户的剪贴板内容,以便快速处理其中包含的信息。在日常工作中,我们常常需要频繁地复制粘贴各种数据,如文本、链接、图片等...

    sugarcane-paperclip-b50.jar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...

Global site tag (gtag.js) - Google Analytics