原文地址: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. 【API规范】OpenAPI规范

    OpenAPI规范 openAPI 3.0_百度搜索 OpenAPI Specification 2.0 - CSDN博客 APP相关_API 列表_OpenAPI 2.0_开发指南_移动推送-阿里云 ...

  2. 用keras实现lstm 利用Keras下的LSTM进行情感分析

    1    I either LOVE Brokeback Mountain or think it’s great that homosexuality is becoming more accept ...

  3. mysql的sql分页函数limit使用 (转)

    http://www.cnblogs.com/beijingstruggle/p/5631603.html mysql的sql分页函数limit使用 My sql数据库最简单,是利用mysql的LIM ...

  4. Ubuntu16.04中Docker的卸载

    1:利用sudo apt-get remove docker 进行卸载提示如下,docker未按照所以不能卸载 2:再次查看docker版本,依然还在 3:原因是安装的时候安装的是docker-ce版 ...

  5. node.js " The requested service provider could not be loaded or initialized"

    I'm trying to use any of the NodeJS or NPM commands but I always got the following error: socket: (1 ...

  6. 10 个超炫绘制图表图形的 Javascript 插件【转载+整理】

    原文地址 现在,有很多在线绘制图表和图形(Charts and Graphs)的 JavaScript 插件,这些插件还都是免费,以及图表库.这些插件大量出现的原因是基于一个事实:人们不再依赖于 Fl ...

  7. Selenium2(webdriver)入门之TestNG的安装与简单使用

    上一篇已经搭建好了Eclipse+selenium2的环境,这一篇主要记录下TestNG的使用. 一.在Eclipse中安装TestNG 1.打开eclipse-->help-->Inst ...

  8. http 请求报文

    1.报文 2.http请求方法 restful接口 post:创建 put:更新

  9. MVC+WCF框架下广告位管理——文件上传

    广告位是站点中不可缺少的内容之中的一个.也是能直接给我们站点带来经济收益的内容之中的一个. 好的广告位不仅不会强宾压主,而会为我们的站点锦上添花.起到画龙点睛的作用.因此设计好广告位也是开发过程中一大 ...

  10. 【Linux】找出文件之间的差异

    使用命令comm可以找出2个文件之间的差异 现在有文件如下: Linux:/qinys # cat A.txt apple lemon onion orange pear Linux:/qinys # ...