finfophp
① php如何判断是否是MP3文件
php判断是否是mp3其实就是判断文件的MIME类型,其中mp3的MIME类型为 audio/mpeg
以下几种方法可以获得文件的MIME类型,得到文件类型后就可以进行判断了:
1、mime_content_type()函数判断获取文件类型,然后判断是否是mp3
mime_content_type返回指定文件的MIME类型,用法:
echomime_content_type('xxx.mp3')."n";
echomime_content_type('test.php');
//输出:
audio/mpeg
text/plain
但是php 5.3.0已经将该函数废弃。如果仍想使用此函数,那么可以对php进行配置启用magic_mime扩展。
2、php Fileinfo 获取文件类型(finfo_open)
PHP官方推荐mime_content_type()的替代函数是Fileinfo函数。PHP 5.3.0+已经默认支持Fileinfo函数(fileinfo support-enabled),不必进行任何配置即可使用finfo_open()判断获取文件MIME类型。
用法:
$finfo=finfo_open(FILEINFO_MIME);
$mimetype=finfo_file($finfo,$filename);
finfo_close($finfo);
3、php获取上传文件类型
如果使用php上传文件,检测上传文件的MIME类型,则可以使用全局变量$_FILES['uploadfile']['type'],由客户端的浏览器检测获取文件MIME类型。
得到MIME类型后,再判断是不是audio/mpeg 即可
② Think PHP自带的上传文件类,
上传表单
在ThinkPHP中使用上传功能无需进行特别处理。例如,下面是一个带有附件上传的表单提交:
<form action="__URL__/upload" enctype="multipart/form-data" method="post" >
<input type="text" name="name" />
<input type="file" name="photo" />
<input type="submit" value="提交" >
</form>
注意,要使用上传功能 你的表单需要设置 enctype="multipart/form-data"
多文件上传支持
如果需要使用多个文件上传,只需要修改表单,把
<input type='file' name='photo'>
改为
<input type='file' name='photo1'>
<input type='file' name='photo2'>
<input type='file' name='photo3'>
或者
<input type='file' name='photo[]'>
<input type='file' name='photo[]'>
<input type='file' name='photo[]'>
两种方式的多附件上传系统的文件上传类都可以自动识别。
上传操作
ThinkPHP文件上传操作使用Think\Upload类,假设前面的表单提交到当前控制器的upload方法,我们来看下upload方法的实现代码:
public function upload(){
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->rootPath = './Uploads/'; // 设置附件上传根目录
$upload->savePath = ''; // 设置附件上传(子)目录
// 上传文件
$info = $upload->upload();
if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
}else{// 上传成功
$this->success('上传成功!');
}
}
上传类对图片文件的上传安全做了支持,如果企图上传非法的图像文件,系统会提示 非法图像文件。 为了更好的使用上传功能,建议你的服务器开启finfo模块支持
上传参数
在上传操作之前,我们可以对上传的属性进行一些设置,Upload类支持的属性设置包括:
属性 描述
maxSize 文件上传的最大文件大小(以字节为单位),0为不限大小
rootPath 文件上传保存的根路径
savePath 文件上传的保存路径(相对于根路径)
saveName 上传文件的保存规则,支持数组和字符串方式定义
saveExt 上传文件的保存后缀,不设置的话使用原文件后缀
replace 存在同名文件是否是覆盖,默认为false
exts 允许上传的文件后缀(留空为不限制),使用数组或者逗号分隔的字符串设置,默认为空
mimes 允许上传的文件类型(留空为不限制),使用数组或者逗号分隔的字符串设置,默认为空
autoSub 自动使用子目录保存上传文件 默认为true
subName 子目录创建方式,采用数组或者字符串方式定义
hash 是否生成文件的hash编码 默认为true
callback 检测文件是否存在回调,如果存在返回文件信息数组
上面的属性可以通过两种方式传入:
实例化传入
我们可以在实例化的时候直接传入参数数组,例如:
$config = array(
'maxSize' => 3145728,
'rootPath' => './Uploads/',
'savePath' => '',
'saveName' => array('uniqid',''),
'exts' => array('jpg', 'gif', 'png', 'jpeg'),
'autoSub' => true,
'subName' => array('date','Ymd'),
);
$upload = new \Think\Upload($config);// 实例化上传类
关于saveName和subName的使用后面我们会有详细的描述。
动态赋值
支持在实例化后动态赋值上传参数,例如:
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728;
$upload->rootPath = './Uploads/';
$upload->savePath = '';
$upload->saveName = array('uniqid','');
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');
$upload->autoSub = true;
$upload->subName = array('date','Ymd');
上面的设置和实例化传入的效果是一致的。
上传文件信息
设置好上传的参数后,就可以调用Think\Upload类的upload方法进行附件上传,如果失败,返回false,并且用getError方法获取错误提示信息;如果上传成功,就返回成功上传的文件信息数组。
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->rootPath = './Uploads/'; // 设置附件上传根目录
$upload->savePath = ''; // 设置附件上传(子)目录
// 上传文件
$info = $upload->upload();
if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
}else{// 上传成功 获取上传文件信息
foreach($info as $file){
echo $file['savepath'].$file['savename'];
}
}
每个文件信息又是一个记录了下面信息的数组,包括:
属性 描述
key 附件上传的表单名称
savepath 上传文件的保存路径
name 上传文件的原始名称
savename 上传文件的保存名称
size 上传文件的大小
type 上传文件的MIME类型
ext 上传文件的后缀类型
md5 上传文件的md5哈希验证字符串 仅当hash设置开启后有效
sha1 上传文件的sha1哈希验证字符串 仅当hash设置开启后有效
文件上传成功后,就可以使用这些文件信息来进行其他的数据操作,例如保存到当前数据表或者单独的附件数据表。
例如,下面表示把上传信息保存到数据表的字段:
$model = M('Photo');
// 取得成功上传的文件信息
$info = $upload->upload();
// 保存当前数据对象
$data['photo'] = $info[0]['savename'];
$data['create_time'] = NOW_TIME;
$model->add($data);
单文件上传
upload方法支持多文件上传,有时候,我们只需要上传一个文件,就可以使用Upload类提供的uploadOne方法上传单个文件,例如:
public function upload(){
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->rootPath = './Uploads/'; // 设置附件上传根目录
// 上传单个文件
$info = $upload->uploadOne($_FILES['photo1']);
if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
}else{// 上传成功 获取上传文件信息
echo $info['savepath'].$info['savename'];
}
}
uploadOne方法上传成功后返回的文件信息和upload方法的区别是只有单个文件信息的一维数组。
上传文件的命名规则
上传文件的命名规则(saveName)用于确保文件不会产生冲突或者覆盖的情况。命名规则的定义可以根据你的业务逻辑来调整,不是固定的。例如,如果你采用时间戳的方式来定义命名规范,那么在同时上传多个文件的时候可能产生冲突(因为同一秒内可以上传多个文件),因此你需要根据你的业务需求来设置合适的上传命名规则。这里顺便来说下saveName参数的具体用法。
一、采用函数方式
如果传入的字符串是一个函数名,那么表示采用函数动态生成上传文件名(不包括文件后缀),例如:
// 采用时间戳命名
$upload->saveName = 'time';
// 采用GUID序列命名
$upload->saveName = 'com_create_guid';
也可以采用用户自定义函数
// 采用自定义函数命名
$upload->saveName = 'myfun';
默认的命名规则设置是采用uniqid函数生成一个唯一的字符串序列。
saveName的值支持数组和字符串两种方式,如果是只有一个参数或者没有参数的函数,直接使用字符串设置即可,如果需要传入额外的参数,可以使用数组方式,例如:
// 采用date函数生成命名规则 传入Y-m-d参数
$upload->saveName = array('date','Y-m-d');
// 如果有多个参数需要传入的话 可以使用数组
$upload->saveName = array('myFun',array('__FILE__','val1','val2'));
如果需要使用上传的原始文件名,可以采用__FILE__传入,所以上面的定义规则,最终的结果是 myFun('上传文件名','val1','val2')执行的结果。
二、直接设置上传文件名
如果传入的参数不是一个函数名,那么就会直接当做是上传文件名,例如:
$upload->saveName = time().'_'.mt_rand();
表示上传的文件命名采用时间戳加一个随机数的组合字符串方式。
当然,如果觉得有必要,你还可以固定设置一个上传文件的命名规则,用于固定保存某个上传文件。
$upload->saveName = 'ThinkPHP';
三、保持上传文件名不变
如果你想保持上传的文件名不变,那么只需要设置命名规范为空即可,例如:
$upload->saveName = '';
一般来说不建议保持不变,因为会导致相同的文件名上传后被覆盖的情况。
子目录保存
saveName只是用于设置文件的保存规则,不涉及到目录,如果希望对上传的文件分子目录保存,可以设置autoSub和subName参数来完成,例如:
// 开启子目录保存 并以日期(格式为Ymd)为子目录
$upload->autoSub = true;
$upload->subName = array('date','Ymd');
可以使用自定义函数来保存,例如:
// 开启子目录保存 并调用自定义函数get_user_id生成子目录
$upload->autoSub = true;
$upload->subName = 'get_user_id';
和saveName参数一样,subName的定义可以采用数组和字符串的方式。
注意:如果get_user_id函数未定义的话,会直接以get_user_id字符串作为子目录的名称保存。
子目录保存和文件命名规则可以结合使用。
上传驱动
上传类可以支持不同的环境,通过相应的上传驱动来解决,默认情况下使用本地(Local)上传驱动,当然,你还可以设置当前默认的上传驱动类型,例如:
'FILE_UPLOAD_TYPE' => 'ftp',
'UPLOAD_TYPE_CONFIG' => array(
'host' => '192.168.1.200', //服务器
'port' => 21, //端口
'timeout' => 90, //超时时间
'username' => 'ftp_user', //用户名
'password' => 'ftp_pwd', //密码 ),
表示当前使用Ftp作为上传类的驱动,上传的文件会通过FTP传到指定的远程服务器。
也可以在实例化上传类的时候指定,例如:
$config = array(
'maxSize' = 3145728,
'rootPath' = './Uploads/',
'savePath' = '',
'saveName' = array('uniqid',''),
'exts' = array('jpg', 'gif', 'png', 'jpeg'),
'autoSub' = true,
'subName' = array('date','Ymd'),
);
$ftpConfig = array(
'host' => '192.168.1.200', //服务器
'port' => 21, //端口
'timeout' => 90, //超时时间
'username' => 'ftp_user', //用户名
'password' => 'ftp_pwd', //密码 );
$upload = new \Think\Upload($config,'Ftp',$ftpConfig);// 实例化上传类
③ php判断文件类型用finfo_open还是二进制头文件啊
文本文件可以当成是二进制文件。
若把二进制文件当成文本文件,输出时可能会有非字母与格式控制的字符。
所以,若要判别,只能看文件中是否有非法字符了。
打开和传输是不会出现问题的。更改的话,程序是不会出错的。但你改得对不对,就要看实际情况了
朱滨积氐薷歆垌亢历间筝赪瑚瑚铁铨翼琎新罩技
了解更多……
④ Php 获取文件mime类型的几种方法
多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
php获取文件mime类型有以下几种方法:
1、mime_content_type()函数判断获取mime类型
mime_content_type返回指定文件的MIME类型,
用法:echomime_content_type('php.gif') .
"\n";echomime_content_type('test.php');输出:image/giftext/plain但是php 5.3.0已经将该函数废弃。如果仍想使用此函数,那么可以对php进行配置启用magic_mime扩展。
2、php Fileinfo 获取文件MIME类型(finfo_open)
PHP官方推荐mime_content_type()的替代函数是Fileinfo函数。PHP
5.3.0+已经默认支持Fileinfo函数(fileinfo
support-enabled),不必进行任何配置即可使用finfo_open()判断获取文件MIME类型。
用法:$finfo = finfo_open(FILEINFO_MIME);
$mimetype = finfo_file($finfo, $filename);
finfo_close($finfo);
3、image_type_to_mime_type()获取图片MIME类型
注意:需要在php.ini中配置打开php_mbstring.dll(Windows需要)和extension=php_exif.dll。
4、php上传文件获取MIME类型
⑤ PHP7.4.9版本正式更新,你知道了吗
PHP 7.4.9 版本现已发布,具体更新内容如下:
Apache:修复了错误
#79030
(升级 apache2handler 的 php_apache_sapi_get_request_time 以返回 usec)。COM:修复了错误
#63208
(BSTR 到 PHP字 符串转换不是 binary safe)。修复了错误
#63527
(DCOM 无法使用用户名、密码参数。)。Core :修复了错误
#79740
(不能静态调用 serialize() 和 unserialize() methods)。修复了错误
#79783
(php_str_replace_common 中的段错误)。修复了错误
#79778
(如果转储带有未解决的静态变量的闭包,则断言失败)。修复了错误
#79779
(通过引用分配字符串偏移量的属性时断言失败)。修复了错误
#79792
(如果销毁了空数组,则不会删除 HT 迭代器)。修复了错误
#78598
(在 undef index RW error segfaults 期间更改数组)。修复了错误
#79784
(如果在数组写获取期间的 undef var 期间更改数组,则在 free 后使用)。修复了错误
#79793
(如果更改了未定义索引警告中使用的字符串,则 free 后使用)。修复了错误
#79862
(子级中的公共非静态属性应优先于私有静态)。修复了错误
#79877
(getimagesize 函数在一个空字节后 silently truncates)(cmb)Fileinfo:修复了错误
#79756
(finfo_file 崩溃(FILEINFO_MIME))。FTP:修复了错误
#55857
(大文件上的 ftp_size)。Mbstring:修复了错误
#79787
(mb_strimwidth 不会修剪字符串)。Phar:修复了错误
#79797
(在 phar_parse_zipfile 函数中使用 freed hash key)。(CVE-2020-7068)Reflection:修复了错误
#79487
(::getStaticProperties() 忽略属性修改)。修复了错误
#69804
(::getStaticPropertyValue() throws on protected props)。修复了错误
#79820
(当复制到 ReflectionProperty 的类型被解析时,在 free 之后使用)。Standard:修复了错误
#70362
(Can't () large 'data://' with open_basedir)。修复了错误
#78008
(dns_check_record() 在 Alpine 上始终返回 true)。修复了错误
#79839
(array_walk() 不 respect 属性类型)。
⑥ php通过finfo判断excel文件是什么格式
excel 93-2003后缀为 .xls 的 文件格式是 application/vnd.ms-excel
excel2007格式后缀是 .xlsx 的文件格式是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
php上传文件,可以通过内置的系统函数$_FILES 获取文件的信息。
$_FILES数组内容如下: (其中upfile为获取的表单名称)
$_FILES['upfile']['name'] 客户端文件的原名称。
$_FILES['upfile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
$_FILES['upfile']['size'] 已上传文件的大小,单位为字节。
$_FILES['upfile']['tmp_name'] 文件被上传后在服务端储存的临时文件名
<?php
if(isset($_POST['sub'])){
echo"文件名:".$_FILES['upfile']['name']."<br>";
echo"文件类型:".$_FILES['upfile']['type'];
}
?>
<formenctype="multipart/form-data"method="post"action="f.php">
<inputtype="file"name="upfile"/>
<inputtype="submit"name="sub"value="上传"/>
</form>
上传 。xls文件 返回的信息为
文件名:导入收藏证书模板.xls
文件类型:application/vnd.ms-excel
⑦ php怎么判断1个文件是否正确或者上传成功
$fileType = 'png';break;default:echo 'unknown';}echo 'this is a(an) '.$fileType.' file:'.$typeCode;?>网络过来的,应该是判断文件头二楼:安装fileinfo 扩展 使用finfo_file 函数 手册上的例子 复制内容到剪贴板代码:<?php $finfo = finfo_open(FILEINFO_MIME); // return mime type ala mimetype extension
⑧ thinkphp的http::download怎么做下载文件
公交卡更厉害
⑨ finfo_open()函数 php6能用吗怎么用
PHP6还没有出来,至于函数的使用方法可以参考:http://php.net/manual/zh/function.finfo-open.php