IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

PHP上传文件类型彻底判断方案及PHP+nginx上传大小彻底控制方案

我是陈科学院 2010-01-13 14:09:53 累计浏览 5,060 次
本机暂存

    上回科学院发过一篇讲述上传判断的文章,位置是

PHP JAVA C上传文件如何准确判断文件类型-mime知识普及

    本文目的在于,进一步更正前文所述的mime判断方式,以及增加一个nginx环境里的文件上传大小所影响的代码。

    上传类型控制:

    在我(54chen)工作中发现,其实修改文件的后缀,浏览器就会很傻瓜地传送错误的mime类型,所以前文的判断是一个半错误的方法(除了C代码是正确的)。

    网上流传一段PHP读取文件头判断文件类型的方法,有一些bug,经我(54chen)修改实测,应该是这个样子:

    /**

    * 读取文件前几个字节 判断文件类型

    *

    * @return String

    */

    function checkTitle($filename) {

    $file = fopen($filename, “rb”);

    $bin = fread($file, 2); //只读2字节

    fclose($file);

    $strInfo = @unpack(”c2chars”, $bin);

    $typeCode = intval($strInfo[\'chars1\'].$strInfo[\'chars2\']);

    $fileType = ”;

    switch ($typeCode)

    {

    case 7790:

    $fileType = ‘exe’;

    break;

    case 7784:

    $fileType = ‘midi’;

    break;

    case 8297:

    $fileType = ‘rar’;

    break;

    case 255216:

    $fileType = ‘jpg’;

    break;

    case 7173:

    $fileType = ‘gif’;

    break;

    case 6677:

    $fileType = ‘bmp’;

    break;

    case 13780:

    $fileType = ‘png’;

    break;

    default:

    $fileType = ‘unknown’.$typeCode;

    }

    //Fix

    if ($strInfo[\'chars1\']==’-1′ && $strInfo[\'chars2\']==’-40′ ) {

    return ‘jpg’;

    }

    if ($strInfo[\'chars1\']==’-119′ && $strInfo[\'chars2\']==’80′ ) {

    return ‘png’;

    }

    return $fileType;

    }

    这代码可以非常正确地分出修改后的文件,从而达到阻止修改后缀名上传的情况。

    上传大小控制:

    在PHP代码中直接读取$_FILE的size,而如果是特别大的文件,又使用了PHP+nginx的话,很有可能,超过2M的文件直接就被nginx就抛出来413错误了。

    解决的办法:

    修改/etc/nginx/nginx.conf

    找到对应域名的server段:修改client_max_body_size的值,默认是2M。

    这样子还不够,如果不修改php.ini里的值,你会发现上传的文件用上面的代码判断类型的时候会出问题。

    修改/etc/php.ini

    找到upload_max_filesize,修改这个值,默认是2M。

    一番折腾,类型和大小的控制基本上就完善了。

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 配置Nginx+uwsgi更方便地部署python应用 (累计阅读 107,169)
  2. 使用gettext来支持PHP的多语言 (累计阅读 39,271)
  3. 搜狐闪电邮箱的 Nginx/Postfix 使用模式 (累计阅读 33,898)
  4. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,165)
  5. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,409)
  6. 记录一个软中断问题 (累计阅读 16,957)
  7. 解析nginx负载均衡 (累计阅读 16,626)
  8. 我的PHP,Python和Ruby之路 (累计阅读 13,150)
  9. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,791)
  10. 15个最好的免费开源电子商务平台 (累计阅读 12,542)