zoukankan      html  css  js  c++  java
  • 使用libmagic确定文件MIME类型【示例】【转】

    原文地址:http://blog.csdn.net/vevenlcf/article/details/46122661

    使用libmagic确定文件MIME类型【示例】

    引用:   《http://blog.163.com/lixiangqiu_9202/blog/static/53575037201481310276358/》

    没事写一个上传图片到imagebin.org的程序,但发现imagebin.org限制了上传的文件类型,这当然是可以理解的,imagebin.org为检查你上传的图片文件,如果与上传的文件MIME类型与Content-Type不一致的话会无法上传,我们当然可以手动根据自己上传的文件而设置Content-Type,但显然作为一个懒人,我更希望能够根据图片文件本身自动设置这个参数。

    这个看起来根据文件的后缀名来确定Content-Type是一个不错的选择,毕竟是自己使用,但如果能有个库根据文件识别出MIME文件类型的话,那么我一定会很乐意的,没错,就是抱着这种心态我找到了libmagic,这是一个c语言库,Linux上file命令便是使用了这个库。

    在linux下安装使用这个库非常简单,直接使用包管理器就可以安装了,我们安装后man libmagic可以查看到它的文档,libmagic可以做的不仅仅是检查文件的MIME类型,但这里我只说获取文件MIME类型,至于其它的,请自行查看libmagic文档。

    想要查看文件MIME类型只需要知道4个函数就可以了,
    magic_t magic_open(int flags);
    int magic_load(magic_t cookie, const char *filename);
    void magic_close(magic_t cookie);
    const char *magic_file(magic_t cookie, const char *filename);

    头文件

    1. 1 #include <magic.h>

    gcc编译时需要加上-lmagic参数

    看函数名称就一目了然,先使用magic_open创建一个magic_t数据结构
    再magic_load加载数据库
    此时便可以使用magic_file进行检测了,使用完成后使用magic_close释放资源
    可以说这是libmagic的使用方式。

    想要获取文件MIME类型在调用magic_open时我们的flags要设置为MAGIC_MIME_TYPE,flags的具体参数可以参考libmagic文档
    加载数据库时我们设置NULL来使用默认的数据库,默认的数据库linux一般是/usr/share/misc/magic.mgc,这取决于MAGIC这个系统变量。

    下面是一个简单的示例

     1 #include <stdio.h>
     2 #include <magic.h>
     3  
     4 int main(int argc,char **argv)
     5 {
     6  magic_t cookie;
     7  
     8  cookie=magic_open(MAGIC_MIME_TYPE);
     9  magic_load(cookie,NULL);
    10  puts(magic_file(cookie,argv[1]));
    11  magic_close(cookie);
    12  
    13  return 0;
    14 }

    这切就是这么简单

    下面干脆把上传图片到imagebin.org的程序也放上来吧,以免日后不小心丢掉了

     1 #include <stdio.h>
     2 #include <magic.h>
     3 #include <curl/curl.h>
     4  
     5 size_t filtration_data(void *ptr,size_t size,size_t nmemb,void *data)
     6 {
     7  return nmemb;
     8 }
     9  
    10 int display_progress(void *clientp,double dltotal,double dlnow,
    11   double ultotal,double ulnow)
    12 {
    13  static int onece=0;
    14  
    15  if(ulnow/ultotal > 0)
    16  {
    17   if(ulnow >= ultotal)
    18   {
    19    if(onece) return 0;
    20  
    21    onece=1;
    22   }
    23  
    24   printf("…%.0f%%",ulnow/ultotal*100);
    25   fflush(stdout);
    26  }
    27  
    28  return 0;
    29 }
    30  
    31 int main(int argc,char **argv)
    32 {
    33  CURL *curl;
    34  char *url="http://imagebin.org/index.php";
    35  struct curl_httppost *post=NULL,*last=NULL;
    36  char *res;
    37  const char *content_type;
    38  magic_t cookie;
    39  
    40  cookie=magic_open(MAGIC_MIME_TYPE);
    41  if(!cookie)
    42  {
    43   perror("magic_open");
    44   return -1;
    45  }
    46  
    47  if(magic_load(cookie,NULL) == -1)
    48  {
    49   printf("%s
    ",magic_error(cookie));
    50   magic_close(cookie);
    51   return -1;
    52  }
    53  
    54  content_type=magic_file(cookie,argv[1]);
    55  if(!content_type)
    56  {
    57   puts(magic_error(cookie));
    58   magic_close(cookie);
    59   return -1;
    60  }
    61  
    62  curl_formadd(&post,&last,CURLFORM_COPYNAME,"nickname",
    63    CURLFORM_COPYCONTENTS,"test",CURLFORM_END);
    64  curl_formadd(&post,&last,CURLFORM_COPYNAME,"remember_nickname",
    65    CURLFORM_COPYCONTENTS,"N",CURLFORM_END);
    66  curl_formadd(&post,&last,CURLFORM_COPYNAME,"image",
    67    CURLFORM_FILE,argv[1],
    68    CURLFORM_CONTENTTYPE,content_type,CURLFORM_END);
    69  curl_formadd(&post,&last,CURLFORM_COPYNAME,"title",
    70    CURLFORM_COPYCONTENTS,"test",CURLFORM_END);
    71  curl_formadd(&post,&last,CURLFORM_COPYNAME,"description",
    72    CURLFORM_COPYCONTENTS,"test",CURLFORM_END);
    73  curl_formadd(&post,&last,CURLFORM_COPYNAME,"disclaimer_agree",
    74    CURLFORM_COPYCONTENTS,"Y",CURLFORM_END);
    75  curl_formadd(&post,&last,CURLFORM_COPYNAME,"Submit",
    76    CURLFORM_COPYCONTENTS,"Submit",CURLFORM_END);
    77  curl_formadd(&post,&last,CURLFORM_COPYNAME,"mode",
    78    CURLFORM_COPYCONTENTS,"add",CURLFORM_END);
    79  
    80  curl=curl_easy_init();
    81  curl_easy_setopt(curl,CURLOPT_URL,url);
    82  curl_easy_setopt(curl,CURLOPT_HTTPPOST,post);
    83  curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1);
    84  curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,filtration_data);
    85  curl_easy_setopt(curl,CURLOPT_USERAGENT,"Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Firefox/31.0");
    86  curl_easy_setopt(curl,CURLOPT_NOPROGRESS,0);
    87  curl_easy_setopt(curl,CURLOPT_PROGRESSFUNCTION,display_progress);
    88  
    89  curl_easy_perform(curl);
    90  curl_easy_getinfo(curl,CURLINFO_EFFECTIVE_URL,&res);
    91  printf("
    %s
    ",res);
    92  curl_easy_cleanup(curl);
    93  curl_formfree(post);
    94  magic_close(cookie);
    95  
    96  return 0;
    97 }

    依葫芦 画瓢 :

     1 #include <stdio.h>  
     2 #include <magic.h>  
     3   
     4 int main(int argc,char **argv)  
     5 {  
     6  struct magic_set   *cookie = NULL;  
     7   
     8  cookie=magic_open(MAGIC_MIME);  
     9  magic_load(cookie, NULL);  
    10  puts(magic_file(cookie,argv[1]));  
    11  magic_close(cookie);  
    12   
    13  return 0;  
    14 }  
  • 相关阅读:
    dirname,basename的用法与用途
    终极解决方案——sbt配置阿里镜像源,解决sbt下载慢,dump project structure from sbt耗时问题
    linux-manjaro下添加Yahei Hybrid Consola字体
    Idea无法调出搜狗等中文输入法
    Spring 源码学习系列
    BF算法
    Mybatis Mapper接口是如何找到实现类的-源码分析
    Lua脚本在redis分布式锁场景的运用
    GO语言一行代码实现反向代理
    SpringMVC源码分析-400异常处理流程及解决方法
  • 原文地址:https://www.cnblogs.com/the-tops/p/7839095.html
Copyright © 2011-2022 走看看