原文地址: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. mysql主从备份及原理分析

    一.mysql主从备份(复制)的基本原理mysql支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.mysql复制基于主服务器在二进制日志中跟踪所有对数据库的更 ...

  2. Ubuntu环境变量解析

    在Ubuntu中有如下几个文件可以设置环境变量 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. /e ...

  3. Centos安装FTP服务器和配置

    安装 yum install vsftpd 启动/重启/关闭 /sbin/service vsftpd start /sbin/service vsftpd restart /sbin/service ...

  4. 转:RNN(Recurrent Neural Networks)

    RNN(Recurrent Neural Networks)公式推导和实现 http://x-algo.cn/index.php/2016/04/25/rnn-recurrent-neural-net ...

  5. c#:winform从一个toolstriptool上拖动一个图标到一个自定义usercontrol内。

    效果: 在一个winform工程中,添加一个ToolStrip然后给它添加一个ToolStripButton(tsbStart,它就是红色框圈选的图标) this.toolStripTools = n ...

  6. disconf-自动注入属性变化

    disconf-自动注入属性变化 disconf官网:http://disconf.readthedocs.io/zh_CN/latest/ 自动注入属性:http://disconf.readthe ...

  7. OpenGL ES 3.0之顶点缓冲

    所谓顶点缓冲就是直接将顶点数据存储在gpu的一段缓冲区,不需要从cpu拷贝到gpu.提高了程序的运行效率. 操作步骤 1.创建顶点缓冲对象 GLuint vertexBufferID; 2.分配空间 ...

  8. WIN10系统右击开始菜单没有属性选项怎么办

    修复方法一:1.按下"WIN+R"输入:regedit回车,进入注册表编辑器:2.在注册表左侧依次打开:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ ...

  9. linux:C++实现ping

    转载自: //http://blog.chinaunix.net/uid-25909722-id-2762079.html #include <stdio.h> #include < ...

  10. ArcEngine应用程序中无法实现TOC图层多选

    在ArcMap的内容列表中,Ctrl和Shift多选.反选等操作图层非常方便. 然而遗憾的是:经测试,查证在ArcEngine应用程序中无法使用此接口,只能通过在Desktop中来使用IContent ...