PHP 文件上传及格式验证
文件格式验证/**
* 验证文件格式
* @param source$filesTag 上传文件标识
* @param array $suffix_array 验证格式
* @param int $max_size 最大大小(默认10兆)
* @param int $min_size 最小大小(默认1K)
* @return mixed返回值 原文件名
*/
function check_upload_file($filesTag = 'file', $suffix_array = array('jpg', 'jpeg', 'png'), $max_size = 10, $min_size = 0.001){
$max_size = 1024 * 1024 * $max_size;
$min_size = 1024 * 1024 * $min_size;
$file_name = $_FILES[$filesTag]['name']; // 原文件名
$file_size = $_FILES[$filesTag]['size']; // 文件大小
$tmp_name = $_FILES[$filesTag]['tmp_name']; // 服务器上临时文件名
// 检查是否是通过 HTTP POST 上传
if (@is_uploaded_file($tmp_name) === false) setBreakDesc(5000, array(), '上传文件来源错误');
// 检查文件名
if (!$file_name) setBreakDesc(5000, array(), '请上传文件');
// 检查扩展名
$suffix = getFileSuffix($file_name); // 获得文件扩展名
if (in_array($suffix, $suffix_array) === false) setBreakDesc(5000, array(), '请上传正确格式的文件');
// 检查文件最大大小
if ((string)$file_size > (string)$max_size) setBreakDesc(5000, array(), '上传文件大小超过限制');
// 检查文件最小大小
if ((string)$file_size < (string)$min_size) setBreakDesc(5000, array(), '上传文件太小');
// 原文件名
$response['file_name'] = $file_name;
return $response;
}
文件上传
/**
* 文件上传
* @param string $upload_path 上传路径, 以 / 结尾
* @param string $filesTag 上传文件标识
* @return string 新文件名
* @throws Exception
*/
function upload_file($upload_path = "", $filesTag = 'file'){
if (empty($upload_path)) setBreakDesc(5000, array(), '请确认上传路径');
$file_name = $_FILES[$filesTag]['name']; // 原文件名
$suffix = getFileSuffix($file_name); // 文件扩展名
$tmp_name = $_FILES[$filesTag]['tmp_name']; // 服务器上临时文件名
// 目录不存在则创建
if (!file_exists($upload_path)) mkdir($upload_path, 0755, true);
// 检查目录写权限
if (@is_writable($upload_path) === false) setBreakDesc(5000, array(), '上传目录没有权限');
// 新文件名
$upload_file_name = date("His") . '_'.md5(uniqid()).'_' . rand(10000, 99999) . ".{$suffix}";
// 上传路径+上传的文件名
$file_path = $upload_path . "{$upload_file_name}";
// 上传文件
if (move_uploaded_file($tmp_name, $file_path) === false) setBreakDesc(5000, array(), '上传文件失败');
chmod($file_path, 0644);
clearstatcache();
return $upload_file_name;
}
公共状态码
return array(
'response_code' => array(
1000=>'执行成功',
5000=>'执行失败',
)
);
公共方法
/**
* PHP 获取文件后缀
* @param string $str 文件名
* @return string 后缀
*/
function getFileSuffix($str){
$suffix = explode(".",$str);
return strtolower(end($suffix));
}
/**
* 设置中断提示信息
* @param int $code状态码
* @param array $data数据
* @param string $msg自定义提示语
* @return void
*/
function setBreakDesc($code = 5000, $data = array(), $msg = '')
{
$status['code'] = $code; // 状态码
$status['msg'] = empty($msg) ? C('response_code')[$code] : $msg; // 提示语
if (!empty($data)) $status['result'] = $data;// 数据
header('Content-Type:application/json; charset=utf-8');
exit(json_encode($status,JSON_UNESCAPED_UNICODE));
}
页:
[1]