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

使用Paperclip上传文件,如果文件名包含中文,会导致Arel抛出一个异常:
[quote]Encoding::CompatibilityError (incompatible character encodings: ASCII-8BIT and UTF-8)[/quote]
这个问题在StackOverflow上也有人在问,不止是中文,其他语言也有。huacnlee在2010年就创建了这个Issue,Paperclip目前(v2.5.2)还没有修复:
[url]https://github.com/thoughtbot/paperclip/issues/301[/url]

我尝试去搞清楚到底是哪里的问题,可惜功力不够,在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

[b]注:我所用的Arel是v2.0.10[/b]
贴出这个给面临同样问题的同学们应应急,如果有人知道更好的解决办法,也请告诉我。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值