`

Monkey Patch让Paperclip支持中文名称的文件上传

阅读更多
使用Paperclip上传文件,如果文件名包含中文,会导致Arel抛出一个异常:
引用
Encoding::CompatibilityError (incompatible character encodings: ASCII-8BIT and UTF-8)

这个问题在StackOverflow上也有人在问,不止是中文,其他语言也有。huacnlee在2010年就创建了这个Issue,Paperclip目前(v2.5.2)还没有修复:
https://github.com/thoughtbot/paperclip/issues/301

我尝试去搞清楚到底是哪里的问题,可惜功力不够,在Paperclip的源码里转悠半天也没找到入手的地方。时间紧迫,只能退而求其次用Monkey Patch弄了一个“可以工作”的东西。新建文件config/initializers/arel_monkey_patch.rb,内容如下:
# encoding: utf-8
# 这个Monkey Patch是为了让Paperclip能上传名字包含中文的文件,而做的临时方案
# 当下面地址所述bug被修复后,请立即更新Paperclip至新版本,并删除此文件
# https://github.com/thoughtbot/paperclip/issues/301
module Arel
  module Visitors
    class ToSql < Arel::Visitors::Visitor
      private
      def visit_Arel_Nodes_Values o
        begin
          "VALUES (#{o.expressions.zip(o.columns).map { |value, column|
            quote(value, column && column.column)
          }.join ', '})"
        rescue Encoding::CompatibilityError
          "VALUES (#{o.expressions.zip(o.columns).map { |value, column|
            quote(value.is_a?(String) ? value.force_encoding('UTF-8') : value, column && column.column)
          }.join ', '})"
        end
      end
    end
  end
end

注:我所用的Arel是v2.0.10
贴出这个给面临同样问题的同学们应应急,如果有人知道更好的解决办法,也请告诉我。

分享到:
评论
2 楼 tiroc 2012-02-28  
liushooter 写道
灰常感谢 tiroc 

1 楼 liushooter 2012-02-28  
灰常感谢 tiroc 

相关推荐

    rails上传文件_paperclip

    NULL 博文链接:https://mylir.iteye.com/blog/800734

    Rails的文件附件扩展Paperclip.zip

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

    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 ...

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

    当前,PaperclipTorrent在Paperclip上需要一个边缘版本以支持多种样式保存。 要使用,请将以下内容添加到您的Gemfile中: gem 'paperclip', github: "thoughtbot/paperclip" gem 'paperclip_torrent', github: ...

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

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

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

    可以在以下位置找到Paperclip以及PaperclipOptimizer的保养好的货叉: PaperclipOptimizer是一个处理器,用于优化和缩小上传的图像。 这仅仅是围绕一个瘦包装 ,它支持许多外部优化库如 , , , , , , , , ,...

    paperclip

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

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

    保存到云端: Curl - http://www.php.net/manual/en/book.curl.phpFileInfo - http://www.php.net/manual/en/book.fileinfo.php图像处理: ImageMagick - ... 您的文件将类似于: [global]us

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

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

    laravel-ide-helper-hook-paperclip:将Paperclip支持添加到Laravel IDE Helper

    一个Laravel包添加支持Laravel IDE助手。 安装 您可以通过composer安装该软件包: composer require daniel-de-wit/laravel-ide-helper-hook-paperclip 回形针挂钩是使用加载的,如果禁用,请阅读“ 。 用法 正常...

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

    这个 gem 使用常规文件系统存储提供程序和 ActiveRecord 通过自动附件加密扩展了 Paperclip。 安装 将此行添加到应用程序的 Gemfile 中: gem 'paperclip-storage-encrypted_filesystem', git: '...

    laravel-paperclip:雄辩的Laravel文件附件解决方案

    尽管名称如此,但不应将其视为Ruby的Paperclip宝石的匹配项。 它不使用文件存储本身,而是使用Laravel的内部存储驱动程序和配置。 这在使用了 ,并且此程序包可以使用其任何(和您的自定义书面形式)变体操作。 ...

    paperclip-s3:未维护

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

    paperclip-av-qtfaststart:修复 FFmpeg MP4 视频文件

    修复 FFmpeg MP4 视频文件。 安装 将此行添加到应用程序的 Gemfile 中: gem 'paperclip-av-qtfaststart' 然后执行: $ bundle 或者自己安装: $ gem install paperclip-av-qtfaststart 用法 当 FFmpeg 生成...

    mongoid-paperclip:蒙古族

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

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

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

    1.12.2paperclip.jar

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

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

    PaperClip - ActiveRecord的简单文件附件管理

    1.16.5-paperclip.jar

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

    paperclip_redis:使用为回形针编写的 redis 支持的存储

    由编写为的存储支持。 用法 使用环境变量PAPERCLIP_REDIS来定义 redis 服务器的位置 PAPERCLIP_REDIS=http://remotehost:6379/ 特约paperclip_redis 查看最新的 master 以确保该功能尚未实现或 bug 尚未修复。 ...

Global site tag (gtag.js) - Google Analytics