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_TYPES
和VALID_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