Rails 3回形针mime类型

我的Rails应用程序在识别Office 2007文档时遇到问题(pptx,xlsx,docx); 它通过与应用程序/ zip mime类型的回形针上传。

它也出现我的系统(OSX Lion)也检测到该文件为zip。

james@JM:~$  file --mime -b test.docx 
application/zip; charset=binary

我试过把下面的代码添加到我的initializers / mime_types中

Rack::Mime::MIME_TYPES.merge!({
    ".docx"     => "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
})

但没有运气。

有任何想法吗?


这是依赖于浏览器的。 浏览器将mime类型设置为内容类型。 这取决于浏览器实现以及客户机上可能存在的任何可能的客户端MIME类型设置。

我得出的结论是,通过单独的MIME类型(即内容类型)来检查文档类型是不可靠的。 它需要混合检查MIME类型和文件扩展名。 单独的文件扩展名也不是那么可靠,但两者的组合可能可以合理地工作。

可悲的是,开箱即用的Paperclip似乎不支持通过文件扩展名进行验证,因此需要自定义代码。 以下是我作为自定义验证提出的内容:

has_attached_file :file, ...

validate :mime_type_or_file_extension

private
def mime_type_or_file_extension
  if self.file.present? &&
     !VALID_UPLOAD_FILE_CONTENT_TYPES.include?(self.file_content_type) &&
     !VALID_UPLOAD_FILE_EXTENSIONS.include?(Pathname.new(self.file_file_name).extname[1..-1])
    self.errors.add(:file_file_name, "must be one of ." + VALID_UPLOAD_FILE_EXTENSIONS.join(' .'))
  end
end

其中VALID_UPLOAD_FILE_CONTENT_TYPESVALID_UPLOAD_FILE_EXTENSIONS是我们在初始化程序中定义的两个数组。 我们的附件被称为“文件”

也许像这样的东西可以添加到Paperclip gem作为拉取请求。 我会看看我是否找到时间。

更新( 12/23/2011 @Jamsi问及下载。 我们在控制器的响应头中设置Content-Disposition和Content-Type,如下所示:

  response.headers['Content-Disposition'] = "attachment; filename=#{@upload.file_file_name}"
  response.headers['Content-Type'] = Rack::Mime.mime_type(File.extname(@upload.file_file_name))

其中@upload是我们的文件(Paperclip)对象。

链接地址: http://www.djcxy.com/p/7943.html

上一篇: Rails 3 paperclip mime type

下一篇: Getting MimeType subtype with Apache tika