免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-05 18:17 |只看该作者 |倒序浏览
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. # 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  

  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-05 18:18 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP