在我的应用程序中,我允许用户通过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
以下是我的文本文件中的内容示例。注意第一个字符,它是一个特殊的符号,这是阻止浏览器正确显示该文件内容的原因。如果我删除了那个符号,一切都会好的
※添付のデザインは,あくまで试案です。最近の潮流のシンプルなデザインにしてみました。
提前致谢!
答案 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