我怎么能用Erlang知道mime类型的文件?
谢谢。
答案 0 :(得分:4)
如果您想根据其扩展名了解文件的mime类型,可以使用未记录的inets函数httpd_conf:load_mime_types/1
。这与mime.types
文件(OTP中的一个inets httpd示例中的一个)一起将为您提供文件扩展名列表及其默认关联的mime类型。以下代码将根据扩展名为您提供给定文件名的标准mime类型:
mime_type(FileName) ->
"." ++ Extension = filename:extension(FileName),
MimeTypes = mime_types(),
proplists:get_value(Extension, MimeTypes).
mime_types() ->
MimeTypesFile = filename:join(code:lib_dir(inets),
"examples/server_root/conf/mime.types"),
{ok, MimeTypes} = httpd_conf:load_mime_types(MimeTypesFile),
MimeTypes.
您现在可以在文件名上使用mime_type/1
(例如example.pdf
),如果已知(在这种情况下为"application/pdf"
)或undefined
,它将返回默认的mime类型否则。
如果您要重复执行此操作,最好将httpd_conf:load_mime_types/1
inets
httpd
服务器的结果缓存,这样您就可以避免阅读并一直解析mime类型文件。
答案 1 :(得分:4)
取决于你想要什么。如果它不重要,那么您可以非常简单,只需使用* NIX环境中通常可用的file
命令。它超越了使用多个测试(文件系统,幻数和文本检查)的文件扩展名猜测。
1> os:cmd("file -i erl_crash.dump").
"erl_crash.dump: text/plain; charset=us-ascii\n"
您可以获得要解析该输出的位。这是非常低效的,因为你每次调用都会产生一个操作系统进程,但这很简单。
如果你需要高效的东西,你可能想在erlang中编写C驱动程序(例如使用libmagic)或本机实现,但我不知道任何现有的。