`

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

    在Ruby on Rails框架中,Paperclip是一个非常流行的用于处理文件上传的库。它提供了一种简单而优雅的方式来管理和处理模型中的附件,如图片、文档等。Paperclip与ActiveRecord紧密集成,使得在Rails应用中添加文件...

    Ruby-CarrierWaveRubyWeb框架更优雅的解决方案文件上传

    在实际项目中,CarrierWave还可以与其他库结合使用,比如Paperclip或ActiveStorage,它们也提供了文件上传的解决方案。选择哪个库主要取决于项目需求,如存储需求、性能考虑以及对社区支持的依赖。 总结起来,Ruby-...

    ruby上传文件

    9. **Carrierwave或Paperclip**:这两个是Ruby社区广泛使用的文件上传库,它们提供了处理文件上传、缩略图生成、版本控制等功能,简化了开发流程。 10. **Validation**:在保存文件信息到数据库之前,你可能需要...

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

    升级版本后Rails的文件上传

    Rails提供了多种处理文件上传的方法,包括直接存储到本地文件系统、使用云存储服务(如Amazon S3)以及第三方库如Paperclip、Carrierwave或ActiveStorage等。在升级Rails版本后,我们需要关注以下几个关键知识点: ...

    rails 文件上传

    在Ruby on Rails框架中,文件上传是一个常见的需求,例如用户头像、产品图片或文档的上传。本篇文章将深入探讨Rails中的文件上传机制,并结合给定的“rails 文件上传”主题,提供关于如何在Rails应用中实现文件上传...

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

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

    PaperClip也支持文件删除和更新。当模型实例被更新或删除时,相关的文件也会被同步处理,避免了数据不一致的问题。 在版本控制方面,给定的压缩包文件`thoughtbot-paperclip-d972522`很可能是一个特定版本的...

    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 回形针挂钩是使用加载的,如果禁用,请阅读“ 。 用法 正常...

    rails 多图上传.txt

    - 使用Paperclip处理上传的文件,包括存储和缩放等操作。 通过上述步骤,即可实现一个完整的Rails多图上传功能。此方案不仅提供了前端用户友好的交互体验,还利用了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-...

Global site tag (gtag.js) - Google Analytics