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

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

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

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

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. Vibe新开源项目 - Vaala AI Gateway (2026-05-17 02:10:19)
  2. SmartPerfetto 架构文章 Q&A:8 个深度技术问答 (2026-04-10 11:00:00)
  3. 让 AI 把我的 PHP 博客重写成 Go (2026-03-27 18:33:54)

查看更多 后端 文章 →

建议继续学习

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