在Ruby中检测上传文件的MIME类型
是否有一种万无一失的方法可以在 Ruby 或 Ruby on Rails 中检测上传文件的 MIME 类型?我使用 SWFupload 上传 JPEG 和 PNG,content_type
始终为 "application/octet-stream"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
ruby-filemagic gem 可以做到这一点:
这个 gem 根本不查看文件扩展名。它读取一些文件内容并使用它来猜测文件的类型。
The ruby-filemagic gem will do it:
This gem does not look at the file extension at all. It reads a bit of the file contents and uses that to guess the file's type.
在 Ruby on Rails 中,您可以执行以下操作:
In Ruby on Rails you can do:
ruby-filemagic gem 是很好的解决方案,但需要对 libmagic 的额外依赖(最近作为 CarrierWave::MagicMimeTypes 删除的一部分从 CarrierWave 中删除)。
如果您对纯 Ruby 实现感兴趣,请考虑 MimeMagic gem!它适用于 freedesktop.org mime 数据库中列出的文件类型:
对于 Microsoft Office 2007+ 格式(xlsx、docx 和 pptx),需要覆盖(除非您可以接受通用的“application/zip”MIME 类型)这些文件)
The ruby-filemagic gem is good solution, but requires additional dependencies on libmagic (recently removed from CarrierWave as part of CarrierWave::MagicMimeTypes removal).
If you're interested in a pure ruby implementation, consider the MimeMagic gem! It works well for file types listed in the freedesktop.org mime database:
For Microsoft Office 2007+ formats (xlsx, docx, and pptx), require the overlay (unless you're okay with the generic "application/zip" MIME type for these files)
您可以根据文件的魔术头使用这种可靠的方法:
You can use this reliable method base on the magic header of the file :
截至 2021 年,我认为根据所有可用提示(幻数、幻数不够时的文件名、用户提示)计算 mime 类型的最佳工具是 马塞尔。
无耻地引用文档本身:
As of 2021, I would claim that the best tool to compute mime types based on all the available hints (magic number, file name when the magic number does not suffice, user hints) is Marcel.
To shamelessly quote the documentation itself:
filemagic gem 是一个很好的解决方案,但依赖于许多不必要的 gem。 (rails、aws-sdk-core、...)
如果您的应用程序很小且仅在 Linux 或 OSX 中运行,请考虑使用
file
程序:注意:替换
__FILE__
任何 expr 都包含文件路径。filemagic gem is good solution but depends lots of unnecessary gems. (rails, aws-sdk-core, ...)
If your app is small and only runs in Linux or OSX, consider to use
file
program:Note: Replace
__FILE__
with any expr contains the filepath.mimemagic gem 也会
做到https://github.com/minad/mimemagic
从官方文档中
mimemagic gem will also do it
https://github.com/minad/mimemagic
from the oficial documentation
如果您从头开始执行此操作,请安装 mimemagic gem
gem 'mimemagic'
打开流(目标图像的字节),
然后检查数据流的文件类型,例如:
MimeMagic.by_magic(result) .type == "image/jpeg"
即使如上所述
%w(JPEG GIF TIFF PNG).include?(MimeMagic.by_magic(result).type)
这可能更多优雅的
in case you are doing this from scratch, install mimemagic gem
gem 'mimemagic'
open stream(bytes of target image)
then check data-stream's file type for example:
MimeMagic.by_magic(result).type == "image/jpeg"
even though as mentioned above
%w(JPEG GIF TIFF PNG).include?(MimeMagic.by_magic(result).type)
this might be more elegant
您可以使用
Mime::Type.lookup_by_extension(extention_name)
谢谢
You can use
Mime::Type.lookup_by_extension(extention_name)
Thanks