原文地址: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.  #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这个系统变量。

下面是一个简单的示例

 #include <stdio.h>
#include <magic.h> int main(int argc,char **argv)
{
magic_t cookie; cookie=magic_open(MAGIC_MIME_TYPE);
magic_load(cookie,NULL);
puts(magic_file(cookie,argv[]));
magic_close(cookie); return ;
}

这切就是这么简单

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

 #include <stdio.h>
#include <magic.h>
#include <curl/curl.h> size_t filtration_data(void *ptr,size_t size,size_t nmemb,void *data)
{
return nmemb;
} int display_progress(void *clientp,double dltotal,double dlnow,
double ultotal,double ulnow)
{
static int onece=; if(ulnow/ultotal > )
{
if(ulnow >= ultotal)
{
if(onece) return ; onece=;
} printf("…%.0f%%",ulnow/ultotal*);
fflush(stdout);
} return ;
} int main(int argc,char **argv)
{
CURL *curl;
char *url="http://imagebin.org/index.php";
struct curl_httppost *post=NULL,*last=NULL;
char *res;
const char *content_type;
magic_t cookie; cookie=magic_open(MAGIC_MIME_TYPE);
if(!cookie)
{
perror("magic_open");
return -;
} if(magic_load(cookie,NULL) == -)
{
printf("%s\n",magic_error(cookie));
magic_close(cookie);
return -;
} content_type=magic_file(cookie,argv[]);
if(!content_type)
{
puts(magic_error(cookie));
magic_close(cookie);
return -;
} curl_formadd(&post,&last,CURLFORM_COPYNAME,"nickname",
CURLFORM_COPYCONTENTS,"test",CURLFORM_END);
curl_formadd(&post,&last,CURLFORM_COPYNAME,"remember_nickname",
CURLFORM_COPYCONTENTS,"N",CURLFORM_END);
curl_formadd(&post,&last,CURLFORM_COPYNAME,"image",
CURLFORM_FILE,argv[],
CURLFORM_CONTENTTYPE,content_type,CURLFORM_END);
curl_formadd(&post,&last,CURLFORM_COPYNAME,"title",
CURLFORM_COPYCONTENTS,"test",CURLFORM_END);
curl_formadd(&post,&last,CURLFORM_COPYNAME,"description",
CURLFORM_COPYCONTENTS,"test",CURLFORM_END);
curl_formadd(&post,&last,CURLFORM_COPYNAME,"disclaimer_agree",
CURLFORM_COPYCONTENTS,"Y",CURLFORM_END);
curl_formadd(&post,&last,CURLFORM_COPYNAME,"Submit",
CURLFORM_COPYCONTENTS,"Submit",CURLFORM_END);
curl_formadd(&post,&last,CURLFORM_COPYNAME,"mode",
CURLFORM_COPYCONTENTS,"add",CURLFORM_END); curl=curl_easy_init();
curl_easy_setopt(curl,CURLOPT_URL,url);
curl_easy_setopt(curl,CURLOPT_HTTPPOST,post);
curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,);
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,filtration_data);
curl_easy_setopt(curl,CURLOPT_USERAGENT,"Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Firefox/31.0");
curl_easy_setopt(curl,CURLOPT_NOPROGRESS,);
curl_easy_setopt(curl,CURLOPT_PROGRESSFUNCTION,display_progress); curl_easy_perform(curl);
curl_easy_getinfo(curl,CURLINFO_EFFECTIVE_URL,&res);
printf("\n%s\n",res);
curl_easy_cleanup(curl);
curl_formfree(post);
magic_close(cookie); return ;
}

依葫芦 画瓢 :

 #include <stdio.h>
#include <magic.h> int main(int argc,char **argv)
{
struct magic_set *cookie = NULL; cookie=magic_open(MAGIC_MIME);
magic_load(cookie, NULL);
puts(magic_file(cookie,argv[]));
magic_close(cookie); return ;
}

使用libmagic确定文件MIME类型【示例】【转】的更多相关文章

  1. php获取文件mime类型Fileinfo等方法

    前几天写到使用wordpress xmlrpc api远程发布文章,如果本地服务器的文章库里某一篇待发表的wordpress文章包含图片文件时,就会使用到WordPress上传文件的API metaW ...

  2. 常见文件MIME类型

    常见文件MIME类型.asx,video/x-ms-asf .xml,text/xml .tsv,text/tab-separated-values .ra,audio/x-pn-realaudio ...

  3. php 获取文件mime类型的方法

    php 获取文件mime类型的方法 使用fileinfo需要安装php_fileinfo扩展. 如已安装可以在extension_dir目录下找到php_fileinfo.dll(windows),f ...

  4. 从零开始学安全(四十)●上传文件MIME类型绕过漏洞防御

    MIME检测原理 服务端MIME类型检测是通过检查http包的Content-Type字段中的值来判断上传文件是否合法的. php示例代码: if($_FILES['userfile']['type' ...

  5. java中得到文件MIME类型的几种方法(转)

     本文转载自:http://hotsunshine.iteye.com/blog/857485 使用 javax.activation.MimetypesFileTypeMap 需要引入activat ...

  6. 常用的 文件 MIME类型

    估计很多朋友对不同后缀的文件对应的MIME类型不熟悉(实际上这么多我也记不住), 所以将平常常见的一些文件后缀对应的MIME类型写了一个对照表,现在奉献给大家: .asx,video/x-ms-asf ...

  7. 获取文件mime类型

    检测文件类型 finfo_file (PHP >= 5.3.0, PECL fileinfo >= 0.1.0) 修改php.ini,将extension=php_fileinfo.dll ...

  8. 【Pyhon】获取文件MIME类型,根据文件类型自定义文件后缀

    场景 下载样本,都是MD5命名的无后缀文件,需要自己手动查询然后修改文件后缀. 根据文件类型自定义后缀可以很方便地根据后缀判断用什么工具分析. 使用说明 libmagic 地址:https://pyp ...

  9. 关于finfo_file函数获取文件mime值验证出错的问题

    今天在做图片上传 验证图片mime值时 突然发现  个别特殊情况下finfo_file 获取的MIME值不能直接使用, 依照官方的写法是 $finfo=finfo_open(FILEINFO_MIME ...

随机推荐

  1. jQuery EasyUI 入门简介

    对于前端开发者来说,在开发过程中应用“框架”这一工具,可以极大的缩短开发时间,提高开发效率.今天我们就开介绍一款常用的框架——jQuery EasyUI. 那什么是jQuery EasyUI呢? jQ ...

  2. Android之ASD组件(一)

    Google在android5.0之后推出新设计标准Material Design,为了能在低版本上使用Material Design,google发布了Android Support Design支 ...

  3. 【cocos2dx中Node类getParent和getChildByTag()】学习体会

    參考http://cn.cocos2d-x.org/doc/cocos2d-x-3.0/d3/d82/classcocos2d_1_1_node.html 当中和child.parent有关的成员函数 ...

  4. http://blog.csdn.net/u014595019/article/details/52805444

    http://blog.csdn.net/u014595019/article/details/52805444 tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码 ...

  5. Linux源码包安装过程及注意事项

    众做周知RedHat Linux使用RPM包管理器安装rpm包,但是RPM包是由红帽编译打包的,通常相对于最新版落后了很多,甚至可能缺少我们所要使用的功能.如果你需要定制想要的软件功能.自定义安装路径 ...

  6. 个人知识点总结——Java并发

    Java并发实在是一个非常深的问题,这里仅仅简单记录一下Java并发的知识点.水太深.假设不花大量的时间感觉全然hold不住,可是眼下的精力全然不够,兴趣也不在这 什么是线程安全性 某个类的行为和其规 ...

  7. pycharm+python+Django之web开发环境的搭建(windows)

    转载:https://blog.csdn.net/yjx2323999451/article/details/53200243/ pycharm+python+Django之web开发环境的搭建(wi ...

  8. 撼动 IT 界的十大编程语言【转载+整理】

    提这些的目的是要保持关注最新的技术.如果你是一个程序员,想要探究未来技术,那这篇文章是你的必读之选.这里列出了10种编程语言,它们可能会改变IT界的工作方式. 下面这些语言都有其实际的需求,举例来说, ...

  9. java报错综合

    1.java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I 方法一:这是因为在struts2自带的antlr-2.7.2.jar包的 ...

  10. 解决IE6兼容性问题的十一大技巧

    10要点解决IE6兼容性问题 1.使用声明 你必须经常在html网页头部放置一个声明,推荐使用严格的标准.例如 <!DOCTYPEHTMLPUBLIC“-//W3C//DTDHTML4.01// ...