admin 发表于 2022-1-15 20:25:50

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]
查看完整版本: PHP 文件上传及格式验证