通过plUpload和paperclip将文本文件上载到AWS S3时出现Charset问题

时间:2014-06-15 13:33:50

标签: ruby-on-rails-3 unicode character-encoding amazon-s3 paperclip

在我的应用程序中,我允许用户通过plUpload库上传文件。在服务器端,我使用paperclip来处理上传的文件。我的存储位置在Amazon S3上。

我有一个包含日语和一些特殊字符的文本文件。如果我将此文件上传到S3,其内容类型将为text/plain。当我在S3上点击该文件的直接链接时,我的浏览器(Chrome)会打开一个新标签页并直接在该标签页中显示内容。但是,我认为由于这种内容类型,浏览器无法在该内容中显示正确的字符。

我尝试使用Trello进行上传,我意识到通过服务器上传到S3的文件随content-type: text/plain; charset=utf-8一起返回(请注意,他们的内容类型中有charset=utf-8部分)

我的问题是:如何通过标题content-type: text/plain; charset=utf-8

返回我的文本文件

以下是我的文本文件中的内容示例。注意第一个字符,它是一个特殊的符号,这是阻止浏览器正确显示该文件内容的原因。如果我删除了那个符号,一切都会好的

  

※添付のデザインは,あくまで试案です。最近の潮流の​​シンプルなデザインにしてみました。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我设法通过覆盖Paperclip UploadedFileAdapter来解决这个问题(在config/initializers/paperclip.rb中)

module Paperclip
  class UploadedFileAdapter < AbstractAdapter
    def initialize(target)
      @target = target

      cache_current_values

      if @target.respond_to?(:tempfile)
        @tempfile = copy_to_tempfile(@target.tempfile)
      else
        @tempfile = copy_to_tempfile(@target)
      end
    end

    class << self
      attr_accessor :content_type_detector
    end

    private

    def cache_current_values
      self.original_filename = @target.original_filename
      @content_type = determine_content_type
      @size = File.size(@target.path)
    end

    def content_type_detector
      self.class.content_type_detector
    end

    def determine_content_type
      content_type = @target.content_type.to_s.strip
      if content_type_detector
        content_type = content_type_detector.new(@target.path).detect
      end

      #NOTE: override paperclip, need to set the utf-8 for text file
      content_type = "text/plain; charset=utf-8" if content_type == "text/plain"

      content_type
    end
  end
end

Paperclip.io_adapters.register Paperclip::UploadedFileAdapter do |target|
  target.class.name.include?("UploadedFile")
end