feiyang10086 发表于 2012-02-13 15:29

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

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,内容如下:

Ruby代码1.# encoding: utf-8   
2.# 这个Monkey Patch是为了让Paperclip能上传名字包含中文的文件,而做的临时方案   
3.# 当下面地址所述bug被修复后,请立即更新Paperclip至新版本,并删除此文件   
4.# https://github.com/thoughtbot/paperclip/issues/301   
5.module Arel   
6.module Visitors   
7.    class ToSql < Arel::Visitors::Visitor   
8.      private   
9.      def visit_Arel_Nodes_Values o   
10.      begin
11.          "VALUES (#{o.expressions.zip(o.columns).map { |value, column|   
12.            quote(value, column && column.column)   
13.          }.join ', '})"   
14.      rescue Encoding::CompatibilityError   
15.          "VALUES (#{o.expressions.zip(o.columns).map { |value, column|   
16.            quote(value.is_a?(String) ? value.force_encoding('UTF-8') : value, column && column.column)   
17.          }.join ', '})"   
18.      end
19.      end
20.    end
21.end
22.end
# 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
贴出这个给面临同样问题的同学们应应急,如果有人知道更好的解决办法,也请告诉我。

小忻黑夜 发表于 2012-02-13 15:29

谢谢分享

2gua 发表于 2012-02-16 08:35

看起来有空还得拾起Ruby来哦。
页: [1]
查看完整版本: Monkey Patch让Paperclip支持中文名称的文件上传