使用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);
头文件
#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类型【示例】【转】的更多相关文章
- php获取文件mime类型Fileinfo等方法
前几天写到使用wordpress xmlrpc api远程发布文章,如果本地服务器的文章库里某一篇待发表的wordpress文章包含图片文件时,就会使用到WordPress上传文件的API metaW ...
- 常见文件MIME类型
常见文件MIME类型.asx,video/x-ms-asf .xml,text/xml .tsv,text/tab-separated-values .ra,audio/x-pn-realaudio ...
- php 获取文件mime类型的方法
php 获取文件mime类型的方法 使用fileinfo需要安装php_fileinfo扩展. 如已安装可以在extension_dir目录下找到php_fileinfo.dll(windows),f ...
- 从零开始学安全(四十)●上传文件MIME类型绕过漏洞防御
MIME检测原理 服务端MIME类型检测是通过检查http包的Content-Type字段中的值来判断上传文件是否合法的. php示例代码: if($_FILES['userfile']['type' ...
- java中得到文件MIME类型的几种方法(转)
本文转载自:http://hotsunshine.iteye.com/blog/857485 使用 javax.activation.MimetypesFileTypeMap 需要引入activat ...
- 常用的 文件 MIME类型
估计很多朋友对不同后缀的文件对应的MIME类型不熟悉(实际上这么多我也记不住), 所以将平常常见的一些文件后缀对应的MIME类型写了一个对照表,现在奉献给大家: .asx,video/x-ms-asf ...
- 获取文件mime类型
检测文件类型 finfo_file (PHP >= 5.3.0, PECL fileinfo >= 0.1.0) 修改php.ini,将extension=php_fileinfo.dll ...
- 【Pyhon】获取文件MIME类型,根据文件类型自定义文件后缀
场景 下载样本,都是MD5命名的无后缀文件,需要自己手动查询然后修改文件后缀. 根据文件类型自定义后缀可以很方便地根据后缀判断用什么工具分析. 使用说明 libmagic 地址:https://pyp ...
- 关于finfo_file函数获取文件mime值验证出错的问题
今天在做图片上传 验证图片mime值时 突然发现 个别特殊情况下finfo_file 获取的MIME值不能直接使用, 依照官方的写法是 $finfo=finfo_open(FILEINFO_MIME ...
随机推荐
- Android -- Camera2(Android5.0)
Camera2 Camera2是Android5.0中的其中一个新的特性,新的API.与原来的camera API相比,不同之处在于: 原生支持RAW照片输出 突发拍摄模式 制约拍照速度的不再是软件而 ...
- Linq-查询上一条下一条
//下一条 int pollid = poll.Where(f => f.PollID < CurrentId).OrderByDescending(o => o.PollID).F ...
- PHP构造函数的重载
由于PHP是弱类型语言,因此函数的输入参数类型无法确定(可以使用类型暗示,但是类型暗示无法用在诸如整型,字符串之类的标量类型上),并且对于一个函数,比如只定义了3个输入参数,PHP却运行调用的时候输入 ...
- 一些常用&实用的Linux命令
这些指令还是很常用的,最起码有些我每天都要用.当然,很多东西还是写成shell脚本用起来更方便. man 命令(查看一个命令的详细帮助信息) 命令 --help(显示一个命令的简单帮助信息) 命令 | ...
- HTTPS 原理与证书实践
1.1 网络安全知识 1.1.1 网结安全出现背景 网络就是实现不同主机之间的通讯,网络出现之初利用TCP/IP协议簇的相关协议概念,已经满足了互连两台主机之间可以进行通汛的目的,虽然看似简简单单几句 ...
- 高速基于echarts的大数据可视化
[Author]: kwu 高速基于echarts的大数据可视化,echarts纯粹的js实现的图表工具.高速开发的过程例如以下: 1.引入echarts的依赖js库 <script type= ...
- WIN10系统如何使用传统WIN7开始菜单
安装StartlsBack 默认按WIN键就可以回到WIN7的菜单了 右击WIN可以点击属性,详细设置菜单样式
- 微信小程序 - debug(调试)
微信小程序调试的方式是基于Chrome. 1. 常见console.log调试(可以具体参考console.log这个函数使用,它可不止这一个作用!) 2.使用NETWORK(我们可以查询到访问了那些 ...
- Fiber Channel SAN Storage
http://www.infotechguyz.com/VMware/FiberChannelSANStorage.html Using Fibre Channel with ESX/ESXi Fib ...
- 使用Spring框架入门一:基于XML配置的IOC/DI的使用
一.Spring框架 1.方法一:逐项导入基础依赖包: spring-core.spring-beans.spring-context.spring-expression 2.方法二:最简洁的导入,直 ...