php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 749|回复: 0

PHP 文件上传及格式验证

[复制链接]

3138

主题

3148

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7946
贡献
0
注册时间
2021-4-14
最后登录
2024-11-21
在线时间
763 小时
QQ
发表于 2022-1-15 20:25:50 | 显示全部楼层 |阅读模式
文件格式验证
[mw_shl_code=applescript,true]/**
* 验证文件格式
* @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;
}
[/mw_shl_code]
文件上传
[mw_shl_code=applescript,true]/**
* 文件上传
* @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;
   
}

[/mw_shl_code]
公共状态码
[mw_shl_code=applescript,true]return array(
    'response_code' => array(
        1000=>'执行成功',
        5000=>'执行失败',
    )
);
[/mw_shl_code]
公共方法
[mw_shl_code=applescript,true]/**
* 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));
}
[/mw_shl_code]





上一篇:Laravel 验证器以及验证场景的使用
下一篇:百科人物爬虫-属性解析
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-22 03:54 , Processed in 0.278511 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表