免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3492 | 回复: 2
打印 上一主题 下一主题

Monkey Patch让Paperclip支持中文名称的文件上传 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-13 15:29 |只看该作者 |倒序浏览
Monkey Patch让Paperclip支持中文名称的文件上传







使用Paperclip上传文件,如果文件名包含中文,会导致Arel抛出一个异常:

引用
Encoding::CompatibilityError (incompatible character encodings: ASCII-8BIT and UTF-

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

论坛徽章:
0
2 [报告]
发表于 2012-02-13 15:29 |只看该作者
谢谢分享

论坛徽章:
0
3 [报告]
发表于 2012-02-16 08:35 |只看该作者
看起来有空还得拾起Ruby来哦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP