Rails 3 回形针 mime 类型 - Office 2007
Posted
技术标签:
【中文标题】Rails 3 回形针 mime 类型 - Office 2007【英文标题】:Rails 3 paperclip mime type - Office 2007 【发布时间】:2011-12-26 15:47:27 【问题描述】:我的 rails 应用程序无法识别 Office 2007 文档(pptx、xlsx、docx);它通过具有 application/zip mime 类型的回形针上传。
我的系统 (OSX Lion) 似乎也将文件检测为 zip。
james@JM:~$ file --mime -b test.docx
application/zip; charset=binary
我尝试将以下内容添加到我的初始化程序/mime_types
Rack::Mime::MIME_TYPES.merge!(
".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
)
但没有运气。
有什么想法吗?
【问题讨论】:
【参考方案1】:这取决于浏览器。 mime 类型由浏览器设置为内容类型。这取决于浏览器实现以及客户端计算机上可能存在的任何可能的客户端 MIME 类型设置。
我得出的结论是,仅通过 mime 类型(即内容类型)检查文档类型并不可靠。它需要混合检查 mime 类型和文件扩展名。单独的文件扩展名也不是那么可靠,但两者的结合可能会合理可行。
遗憾的是,开箱即用的回形针似乎不支持通过文件扩展名进行验证,因此需要自定义代码。这是我想出的自定义验证:
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 中。我看看有没有时间。
更新(2011 年 12 月 23 日) @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)对象。
【讨论】:
谢谢。处理验证..在下载时更改 Content-Disposition 怎么样? (Docx 文件为我下载为 .zip 文件) @Jamsi 不客气。如果你喜欢这个答案,请接受它(点击它左边的大复选标记)——这将有助于我们的分数,请参阅faq。关于下载,我正在更新答案,因为我无法正确格式化评论字段中的代码。以上是关于Rails 3 回形针 mime 类型 - Office 2007的主要内容,如果未能解决你的问题,请参考以下文章
Rails 3 和 JSON:默认渲染器,但自定义 mime 类型