Erlang mime类型

时间:2011-02-03 16:26:54

标签: file erlang mime

我怎么能用Erlang知道mime类型的文件?

谢谢。

2 个答案:

答案 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)或本机实现,但我不知道任何现有的。