【问题标题】:Erlang mime typeErlang mime 类型
【发布时间】:2011-06-20 19:08:46
【问题描述】:

我如何使用 Erlang 知道文件的 mime 类型?

谢谢。

【问题讨论】:

标签: file erlang mime


【解决方案1】:

也许你可以使用这个: mochiweb_mime:from_extension(文件名:扩展名(文件))

%% @author Bob Ippolito %% @copyright 2007 Mochi 媒体公司

%% @doc 根据文件扩展名给出一个好的 MIME 类型猜测。

-模块(mochiweb_mime)。 -作者('bob@mochimedia.com')。 -export([from_extension/1])。

%% @spec from_extension(S::string()) -> string() |未定义 %% @doc 给定文件扩展名(例如“.html”)返回 MIME 的猜测 %% 类型,例如“text/html”。如果没有,将返回原子 undefined 可以得到很好的 %% 猜测。

from_extension(".stl") -> “应用程序/SLA”; from_extension(".stp") -> “申请/步骤”; from_extension(".step") -> “申请/步骤”; from_extension(".dwg") -> “应用程序/acad”; from_extension(".ez") -> “应用程序/安德鲁插图”; from_extension(".ccad") -> “应用程序/clariscad”; from_extension(".drw") -> “申请/起草”; from_extension(".tsp") -> “应用程序/dsptype”; from_extension(".dxf") -> “应用程序/dxf”; from_extension(".xls") -> “应用程序/excel”; from_extension(".unv") -> “申请/i-deas”; from_extension(".jar") -> “应用程序/java-archive”; from_extension(".hqx") -> “应用程序/mac-binhex40”; from_extension(".cpt") -> “应用程序/mac-compactpro”; from_extension(".pot") -> “应用程序/vnd.ms-powerpoint”; from_extension(".ppt") -> “应用程序/vnd.ms-powerpoint”; from_extension(".dms") -> “应用程序/八位字节流”; from_extension(".lha") -> “应用程序/八位字节流”; from_extension(".lzh") -> “应用程序/八位字节流”; from_extension(".oda") -> “申请/官方发展援助”; from_extension(".ogg") -> “应用程序/ogg”; from_extension(".ogm") -> “应用程序/ogg”; from_extension(".pdf") -> “申请/pdf”; from_extension(".pgp") -> “应用程序/pgp”; from_extension(".ai") -> “申请/附言”; from_extension(".eps") -> “申请/附言”; from_extension(".ps") -> “申请/附言”; from_extension(".prt") -> “应用程序/pro_eng”; from_extension(".rtf") -> “应用程序/rtf”; from_extension(".smi") -> “申请/微笑”; from_extension(".smil") -> “申请/微笑”; from_extension(".sol") -> “应用/固体”; from_extension(".vda") -> “应用程序/vda”; from_extension(".xlm") -> “应用程序/vnd.ms-excel”; from_extension(".cod") -> “应用程序/vnd.rim.cod”; from_extension(".pgn") -> “应用程序/x-chess-pgn”; from_extension(".cpio") -> “应用程序/x-cpio”; from_extension(".csh") -> “应用程序/x-csh”; from_extension(".deb") -> “应用程序/x-debian-package”; from_extension(".dcr") -> “应用程序/x-director”; from_extension(".dir") -> “应用程序/x-director”; from_extension(".dxr") -> “应用程序/x-director”; from_extension(".gz") -> “应用程序/x-gzip”; from_extension(".hdf") -> “应用程序/x-hdf”; from_extension(".ipx") -> “应用程序/x-ipix”; from_extension(".ips") -> “应用程序/x-ipscript”; from_extension(".js") -> “应用程序/x-javascript”; from_extension(".skd") -> “应用程序/x-koan”; from_extension(".skm") -> “应用程序/x-koan”; from_extension(".skp") -> “应用程序/x-koan”; from_extension(".skt") -> “应用程序/x-koan”; from_extension(".latex") -> “应用程序/x-乳胶”; from_extension(".lsp") -> “应用程序/x-lisp”; from_extension(".scm") -> “应用程序/x-lotusscreencam”; from_extension(".mif") -> “应用程序/x-mif”; from_extension(".com") -> “应用程序/x-msdos-程序”; from_extension(".exe") -> “应用程序/八位字节流”; from_extension(".cdf") -> “应用程序/x-netcdf”; from_extension(".nc") -> “应用程序/x-netcdf”; from_extension(".pl") -> “应用程序/x-perl”; from_extension(".pm") -> “应用程序/x-perl”; from_extension(".rar") -> “应用程序/x-rar 压缩”; from_extension(".sh") -> “应用程序/x-sh”; from_extension(".shar") -> “应用程序/x-shar”; from_extension(".swf") -> “应用程序/x-shockwave-flash”; from_extension(".sit") -> “应用程序/x-stuffit”; from_extension(".sv4cpio") -> “应用程序/x-sv4cpio”; from_extension(".sv4crc") -> “应用程序/x-sv4crc”; from_extension(".tar.gz") -> “应用程序/x-tar-gz”; from_extension(".tgz") -> “应用程序/x-tar-gz”; from_extension(".tar") -> “应用程序/x-tar”; from_extension(".tcl") -> “应用程序/x-tcl”; from_extension(".texi") -> “应用程序/x-texinfo”; from_extension(".texinfo") -> “应用程序/x-texinfo”; from_extension(".man") -> “应用程序/x-troff 人”; from_extension(".me") -> “应用程序/x-troff-me”; from_extension(".ms") -> “应用程序/x-troff-ms”; from_extension(".roff") -> “应用程序/x-troff”; from_extension(".t") -> “应用程序/x-troff”; from_extension(".tr") -> “应用程序/x-troff”; from_extension(".ustar") -> “应用程序/x-ustar”; from_extension(".src") -> “应用程序/x-wais-源”; from_extension(".zip") -> “应用程序/压缩包”; from_extension(".tsi") -> “音频/TSP-音频”; from_extension(".au") -> “音频/基本”; from_extension(".snd") -> “音频/基本”; from_extension(".kar") -> “音频/midi”; from_extension(".mid") -> “音频/midi”; from_extension(".midi") -> “音频/midi”; from_extension(".mp2") -> “音频/MPEG”; from_extension(".mp3") -> “音频/MPEG”; from_extension(".mpga") -> “音频/MPEG”; from_extension(".aif") -> “音频/x-aiff”; from_extension(".aifc") -> “音频/x-aiff”; from_extension(".aiff") -> “音频/x-aiff”; from_extension(".m3u") -> “音频/x-mpegurl”; from_extension(".wax") -> “音频/x-ms-wax”; from_extension(".wma") -> “音频/x-ms-wma”; from_extension(".rpm") -> “音频/x-pn-realaudio-plugin”; from_extension(".ram") -> “音频/x-pn-realaudio”; from_extension(".rm") -> “音频/x-pn-realaudio”; from_extension(".ra") -> “音频/x-realaudio”; from_extension(".wav") -> “音频/x-wav”; from_extension(".pdb") -> “化学/x-pdb”; from_extension(".ras") -> “图像/cmu 光栅”; from_extension(".gif") -> “图像/gif”; from_extension(".ief") -> “图像/ief”; from_extension(".jpe") -> “图像/JPEG”; from_extension(".jpeg") -> “图像/JPEG”; from_extension(".jpg") -> “图像/JPEG”; from_extension(".jp2") -> “图像/JP2”; from_extension(".png") -> “图像/png”; from_extension(".tif") -> “图像/tiff”; from_extension(".tiff") -> “图像/tiff”; from_extension(".pnm") -> “图像/x-portable-anymap”; from_extension(".pbm") -> “图像/x 便携式位图”; from_extension(".pgm") -> “图像/x-便携式灰度图”; from_extension(".ppm") -> “图像/x-portable-pixmap”; from_extension(".rgb") -> “图像/x-rgb”; from_extension(".xbm") -> “图像/x-x位图”; from_extension(".xwd") -> “图像/x-xwindowdump”; from_extension(".iges") -> “模型/iges”; from_extension(".igs") -> “模型/iges”; from_extension(".mesh") -> “模型/网格”; from_extension(".") -> ""; from_extension(".msh") -> “模型/网格”; from_extension(".silo") -> “模型/网格”; from_extension(".vrml") -> “模型/vrml”; from_extension(".wrl") -> “模型/vrml”; from_extension(".css") -> “文本/CSS”; from_extension(".htm") -> “文本/html”; from_extension(".html") -> “文本/html”; from_extension(".asc") -> “文本/纯文本”; from_extension(".c") -> “文本/纯文本”; from_extension(".cc") -> “文本/纯文本”; from_extension(".f90") -> “文本/纯文本”; from_extension(".f") -> “文本/纯文本”; from_extension(".hh") -> “文本/纯文本”; from_extension(".m") -> “文本/纯文本”; from_extension(".txt") -> “文本/纯文本”; from_extension(".rtx") -> “文本/富文本”; from_extension(".sgm") -> “文本/sgml”; from_extension(".sgml") -> “文本/sgml”; from_extension(".tsv") -> “文本/制表符分隔值”; from_extension(".jad") -> “文本/vnd.sun.j2me.app-descriptor”; from_extension(".etx") -> “文本/x-setext”; from_extension(".xml") -> “应用程序/xml”; from_extension(".dl") -> “视频/dl”; from_extension(".fli") -> “视频/电影”; from_extension(".flv") -> “视频/flv”; from_extension(".gl") -> “视频/gl”; from_extension(".mp4") -> “视频/mp4”; from_extension(".mpe") -> “视频/mpeg”; from_extension(".mpeg") -> “视频/mpeg”; from_extension(".mpg") -> “视频/mpeg”; from_extension(".mov") -> “视频/快速时间”; from_extension(".qt") -> “视频/快速时间”; from_extension(".viv") -> “视频/vnd.vivo”; from_extension(".vivo") -> “视频/vnd.vivo”; from_extension(".asf") -> “视频/x-ms-asf”; from_extension(".asx") -> “视频/x-ms-asx”; from_extension(".wmv") -> “视频/x-ms-wmv”; from_extension(".wmx") -> “视频/x-ms-wmx”; from_extension(".wvx") -> “视频/x-ms-wvx”; from_extension(".avi") -> “视频/x-msvideo”; from_extension(".movi​​e") -> “视频/x-sgi-电影”; from_extension(".mime") -> “www/mime”; from_extension(".ice") -> “x-会议/x-cooltalk”; from_extension(".vrm") -> “x-世界/x-vrml”; from_extension(".spx") -> “音频/ogg”; from_extension(".xhtml") -> “应用程序/xhtml+xml”; from_extension(".bz2") -> “应用程序/x-bzip2”; from_extension(".doc") -> “应用程序/msword”; from_extension(".z") -> “应用程序/x-压缩”; from_extension(".ico") -> “图像/x-图标”; from_extension(".bmp") -> “图像/bmp”; from_extension(".m4a") -> “音频/MPEG”; from_extension(".csv") -> “文本/csv”; from_extension(_) -> 未定义。

%% %% 测试 %% -ifdef(测试)。 -include_lib("eunit/include/eunit.hrl").

exhaustive_from_extension_test() -> T = mochiweb_cover:clause_lookup_table(?MODULE, from_extension), [?assertEqual(V, from_extension(K)) || {K, V}

from_extension_test() -> ?assertEqual("文本/html", from_extension(".html")), ?assertEqual(未定义, from_extension("")), ?assertEqual(未定义, from_extension(".wtf")), 好的。

-endif.

【讨论】:

    【解决方案2】:

    取决于你想要什么。如果它不是关键的东西,您可以非常简单,只需使用在 *NIX 环境中通常可用的file 命令。它超越了使用多个测试(文件系统、幻数和文本检查)来猜测文件扩展名。

    1> os:cmd("file -i erl_crash.dump").
    "erl_crash.dump: text/plain; charset=us-ascii\n"
    

    你可以得到你想要解析输出的位。这是非常低效的,因为您每次调用都会产生一个操作系统进程,但是非常简单。

    如果您需要一些高效的东西,您可能想编写 C 驱动程序(例如使用 libmagic)或在 erlang 中的本机实现,但我不知道任何现有的。

    【讨论】:

      【解决方案3】:

      如果您想根据扩展名了解文件的 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),如果已知,它将返回默认的mime类型(在这种情况下为"application/pdf")或undefined否则。

      如果您要重复执行此操作,最好将 httpd_conf:load_mime_types/1 的结果缓存为 inets httpd 服务器所做的那样,这样您就可以避免读取和解析 mime 类型文件一直都是。

      【讨论】:

        猜你喜欢
        • 2018-06-01
        • 2011-07-13
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 2018-07-19
        • 2011-01-13
        • 2011-10-16
        • 2010-10-28
        相关资源
        最近更新 更多