`
nnnnon
  • 浏览: 150996 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

paperclip 上传文件(解决中文文件无法上传问题)

    博客分类:
  • RORs
阅读更多
在新项目中使用了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/

原文地址:http://yangzhihuan.iteye.com/blog/704331

备注:ruby1.9.2老是提示中文问题,还是老老实实安安心心用ruby1.8.7-p302了。


有一个回复也比较好,但是我自己没有尝试:

引用
引用
木剑先生 写道
如果有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


个人以为这样比改插件的源代码要好。
分享到:
评论

相关推荐

    rails上传文件_paperclip

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

    Ruby-CarrierWaveRubyWeb框架更优雅的解决方案文件上传

    在实际项目中,CarrierWave还可以与其他库结合使用,比如Paperclip或ActiveStorage,它们也提供了文件上传的解决方案。选择哪个库主要取决于项目需求,如存储需求、性能考虑以及对社区支持的依赖。 总结起来,Ruby-...

    ruby上传文件

    9. **Carrierwave或Paperclip**:这两个是Ruby社区广泛使用的文件上传库,它们提供了处理文件上传、缩略图生成、版本控制等功能,简化了开发流程。 10. **Validation**:在保存文件信息到数据库之前,你可能需要...

    升级版本后Rails的文件上传

    Rails提供了多种处理文件上传的方法,包括直接存储到本地文件系统、使用云存储服务(如Amazon S3)以及第三方库如Paperclip、Carrierwave或ActiveStorage等。在升级Rails版本后,我们需要关注以下几个关键知识点: ...

    rails 文件上传

    6. **Paperclip**: Paperclip是另一个流行的文件上传gem,但已不再维护,推荐使用ActiveStorage。如果你正在使用Paperclip,可能需要迁移至ActiveStorage。 7. **存储策略**: 文件可以存储在本地文件系统,也可以...

    Ruby-PaperClipActiveRecord的简单文件附件管理

    PaperClip是由Thoughtbot开发的一个Ruby库,它允许开发者将文件上传功能轻松地添加到ActiveRecord模型中。让我们深入探讨一下这个强大的工具及其工作原理。 首先,PaperClip的核心功能是将文件上传与数据库记录关联...

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

    回形针上传到 S3 要求 aws-sdk 回形针 宝石安装 Gemfile gem ' aws-sdk ' gem ' paperclip ' 并运行 bundle install 创建 s3 这里 设置s3信息 从获取访问密钥和秘密密钥并将它们写好。 然后创建一个config/aws....

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

    将已处理的回形针附件转换为可下载的torrent文件,以供以后检索。 设置 当前,PaperclipTorrent在Paperclip上需要一个边缘版本以支持多种样式保存。 要使用,请将以下内容添加到您的Gemfile中: gem 'paperclip',...

    phrails-paperclip:一个插件,将上传文件并检索它们以供显示

    http://www.php.net/manual/en/book.curl.phpFileInfo - http://www.php.net/manual/en/book.fileinfo.php图像处理: ImageMagick - http://www.php.net/manual/en/book.imagick.phpPhrails-Paperclip Ini 文件该...

    rails 多图上传.txt

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

    Rails的自动完成分页插件

    在Rails应用中处理文件上传,常见的插件有Paperclip、Carrierwave或ActiveStorage(自Rails 5.2起内置)。这些插件提供了处理文件上传、存储、版本控制和删除的功能。它们可以将文件存储在本地磁盘、云服务如Amazon...

    paperclip-s3:未维护

    每一个当您将应用程序部署到,您正在更改RAILS_ROOT,因此您所有上传的文件都将丢失,您的存储桶将一团糟! 默认的Heroku工作路径是默认路径。 如何使用 使用以下命令将宝石添加到您的Gemfile中 gem “paperclip-...

    使用Rails上传和转换视频

    在Rails中,最常用的文件上传库是Paperclip和CarrierWave,但现在更推荐使用ActiveStorage,这是Rails 5.2及更高版本内置的一个功能。ActiveStorage直接与数据库交互,方便管理和存储文件,同时支持通过第三方服务如...

    mongoid-paperclip:蒙古族

    设定宝石文件gem "mongoid-paperclip" 接下来,假设我们有一个用户模型,并且我们希望允许我们的用户上传头像。 Rails.root / app / models / user.rb-包含Mongoid :: Paperclip模块并调用提供的类方法class User ...

    papercrop:Paperclip的一个简单扩展,可以使用jCrop裁剪图像上传

    Paperclip的一个简单扩展,可以使用jCrop裁剪上载的图像。 安装 在您的Gemfile中包含papercrop或手动安装 gem install papercrop 您需要在资产中添加所需的文件... 在您的application.js中 //= require jquery //= ...

    stapler:用于PHP的基于ORM的文件上传包

    它可以用于将文件文件上传(作为附件对象)添加到您的ORM记录中。 虽然不是完全相同的副本,但是如果您以前使用过Paperclip,那么使用此软件包应该会感到很舒服。 订书机由创建。 要求 Stapler当前需要php> = 5.4...

    file_validators:将文件验证器添加到ActiveModel

    文件验证器 File Validators gem将文件大小和内容类型验证添加到ActiveModel。 任何使用ActiveModel的模块,例如... 经过测试,可以与Carrierwave,Paperclip,Dragonfly,Refile等文件上传解决方案一起使用。 验

    attached:一个让用户上传到云端的文件附件工具

    Attached 是一个 Ruby on Rails 文件附件工具,可让用户上传到云端。 gem 默认支持 AWS、Google 和 Rackspace 存储网络。 它受到 Paperclip 的影响(和复制),并大量使用了令人难以置信的 Fog 库。 要求 宝石经过...

Global site tag (gtag.js) - Google Analytics