原文地址: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. [转]shell脚本每行的执行顺序是怎样

    原文:https://blog.csdn.net/weixin_42609121/article/details/83028000 ---------------------------------- ...

  2. Git 以分支的方式同时管理多个项目

    你是否遇到过这样的问题: 你的客户在你们这边做了N个项目,而项目之间又存在着某些业务关联(数据库访问等) 之前你可能是这样处理的,为客户的每个项目创建单独的Git版本 PC项目 手机项目 微信项目 其 ...

  3. Javascript常用语法 (一)

    判断成员是否是一个函数: if (typeof options.sourceMapName === 'function') { mapNameGenerator = options.sourceMap ...

  4. [Go] Returning Multiple Values from a Function in Go

    Returning multiple values from a function is a common idiom in Go, most often used for returning val ...

  5. cocos2d-x3.0 XML解析

    在2dx3.0中xml解析已经不用自己找库了.已经为我们集成好了. text.xml <?xml version ="1.0" encoding ="UTF8&qu ...

  6. mysql生成不重复随机数(unique number generation)

    转自:http://blog.csdn.net/dreamer2020/article/details/52049629 问题来源 业务中有时会遇到要生成不重复随机数的情况,例如,新生成一个商品编号. ...

  7. jetty 9使用

    jetty 9 使用 下载jdk 7 http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-ja ...

  8. Android 关于操作栏 ActionBar 的设计原则【转载+整理】

    原文地址 本文内容 操作栏目的 基本布局 适应旋转和不同的屏幕尺寸 副操作栏的布局 操作栏按钮 上下文操作栏 操作栏清单 设计原则就是为你在编写 Android APP 时,尤其是如何安排操作按钮的位 ...

  9. CentOS7安装Docker与使用篇

    一.在CentOS7上安装Docker篇 1. 查看系统版本: $ cat /etc/redhat-release CentOS Linux release 7.0.1406 (Core) 2. 安装 ...

  10. common.js 2017

    String.IsNullOrEmpty = function (v) { return !(typeof (v) === "string" && v.length ...