目录
PHP上传原理及操作实现
首页 后端开发 php教程 PHP上传原理及操作实现_PHP教程

PHP上传原理及操作实现_PHP教程

Jul 13, 2016 am 10:21 AM
原理

PHP上传原理及操作实现

关于PHP上传文件的函数类库,网上有许多封装很完善,大家直接拿来用就可以。
 
本文章只是说下关于上传原理和简单的上传操作,老鸟就无视了哈^_^~
 
还有一些安全性判断比如:服务端限制能接收图片类型的文件,而客户端恶意将病毒文件的后缀名改为图片配型的文件上传。
 
 
 
(举例单文件上传,多文件原理还是不变,只不过多了点小技巧)
 
 
 
 
 
index.html
 
复制代码
   
    upload files
 
   
       
        上传文件:
       
   
复制代码
1、Form标签enctype属性
 
表单中enctype="multipart/form-data"是用于设置表单的MIME编码。
默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;
只有使用了multipart/form-data且提交方式为Post才能完整的传递文件数据。
 
 
 
2、MAX_FILE_SIZE 隐藏字段
 
MAX_FILE_SIZE 隐藏字段(单位为字节)必须放在文件输入字段之前,其值为接收文件的最大尺寸。这是对浏览器的一个建议,PHP 也会检查此项。
在浏览器端可以简单绕过此设置,因此不要指望用此特性来阻挡大文件。(不过鉴于友好性最好还是在表单中加上此项目,因为它可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。)
 
 
 
upload.php
 
    print_r($_FILES);
?>
我们可以看到:
 
复制代码
Array
(
    [file] => Array
        (
            [name] => 照片文件.jpg
            [type] => image/jpeg
            [tmp_name] => F:\wamp\tmp\php41BB.tmp
            [error] => 0
            [size] => 73886
        )
 
)
复制代码
 
 
3、全局变量 $_FILES的应用
 
  $_FILES['file']['name']  为上传文件的原文件名
 
  $_FILES['file']['type']  为上传文件的 MIME 类型
 
  $_FILES['file']['size']  已上传文件的大小,单位为字节
 
  $_FILES['file']['tmp_name']  文件被上传后在服务端储存的临时文件名()
 
  $_FILES['file']['error']  文件上传的错误代码
 
 
 
4、默认情况下,上传文件会保存在服务端的临时文件夹中,其目录在php.ini中设置
 
php.ini与文件上传有关的一些常用设置:
 
file_uploads ;  是否允许通过HTTP上传文件的开关。默认为ON即是开
 
upload_tmp_dir ;  文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
 
upload_max_filesize;  即允许上传文件大小的最大值。默认为2M
 
post_max_size;  指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
 
 
 
下面是对单文件上传的完整代码,因为是随想随写的,可能逻辑嵌套的有点乱,懂原理最重要。
 
复制代码
    
    //取得上传文件信息
    $fileName=$_FILES['file']['name'];
    $fileType=$_FILES['file']['type'];
    $fileError=$_FILES['file']['error'];
    $fileSize=$_FILES['file']['size'];
    $tempName=$_FILES['file']['tmp_name'];//临时文件名
    
    //定义上传文件类型
    $typeList = array("image/jpeg","image/jpg","image/png","image/gif"); //定义允许的类型
 
 
    if(!is_uploaded_file($tempName)){
        //判断是否是POST上传过来的文件
        exit("不是通过HTTP POST方式上传上来的");
    }else{
        if(!in_array($fileType, $typeList)){
            exit("上传的文件不是指定类型");
        }else{
            if(!getimagesize($tempName)){
                //避免用户上传恶意文件,如把病毒文件扩展名改为图片格式
                exit("上传的文件不是图片");
            }
        }
        if($fileError>0){
            //上传文件错误编号判断
            switch ($fileError) {
                case 1:
                    $message="上传的文件超过了php.ini 中 upload_max_filesize 选项限制的值。"; 
                    break;
                case 2:
                    $message="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。"; 
                    break;
                case 3:
                    $message="文件只有部分被上传。"; 
                    break;
                case 4:
                    $message="没有文件被上传。";
                    break;
                case 6:
                    $message="找不到临时文件夹。"; 
                    break;
                case 7:
                    $message="文件写入失败"; 
                    break;
                case 8:
                    $message="由于PHP的扩展程序中断了文件上传";
                    break;
            }
 
            exit("文件上传失败:".$fileError);
 
        }else{
            if($fileSize>100000){
                //对特定表单的上传文件限制大小
                exit("上传文件超出限制大小");
            }else{
                //避免上传文件的中文名乱码
                $fileName=iconv("UTF-8", "GBK", $fileName);//把iconv抓取到的字符编码从utf-8转为gbk输出
                if(move_uploaded_file($tempName, "uploads/".$fileName)){
                    echo "上传文件成功!";
                }else{
                    echo "上传文件失败";
                }
            }
 
        }
 
    }
 
 
?>
复制代码
5、关于php上传文件的一些常用函数:(具体用法就不贴出来了,自己看API文档吧 ^_^)
 
file_exists  检查文件或目录是否存在
 
is_uploaded_file    判断文件是否是通过 HTTP POST 上传的
 
move_uploaded_file    将上传的文件移动到新位置
 
is_writable   判断给定的文件名是否可写
 
iconv  字符编码互转
 
getimagesize  检查是否为图片文件(其他类型的文件就算后缀名改了也能被检测到)

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/854420.htmlTechArticlePHP上传原理及操作实现 关于PHP上传文件的函数类库,网上有许多封装很完善,大家直接拿来用就可以。 本文章只是说下关于上传原理和简...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

nohup的作用及原理解析 nohup的作用及原理解析 Mar 25, 2024 pm 03:24 PM

nohup的作用及原理解析在Unix和类Unix操作系统中,nohup是一个常用的命令,用于在后台运行命令,即便用户退出当前会话或关闭终端窗口,命令仍然能够继续执行。在本文中,我们将详细解析nohup命令的作用和原理。一、nohup的作用后台运行命令:通过nohup命令,我们可以让需要长时间运行的命令在后台持续执行,而不受用户退出终端会话的影响。这在需要运行

深度探讨Struts框架的原理与实践 深度探讨Struts框架的原理与实践 Feb 18, 2024 pm 06:10 PM

Struts框架的原理解析与实践探索Struts框架作为JavaWeb开发中常用的MVC框架,具有良好的设计模式和可扩展性,广泛应用于企业级应用程序开发中。本文将对Struts框架的原理进行解析,并结合实际代码示例进行探索,帮助读者更好地理解和应用该框架。一、Struts框架的原理解析1.MVC架构Struts框架基于MVC(Model-View-Con

深入解析MySQL MVCC 原理与实现 深入解析MySQL MVCC 原理与实现 Sep 09, 2023 pm 08:07 PM

深入解析MySQLMVCC原理与实现MySQL是目前最流行的关系型数据库管理系统之一,它提供了多版本并发控制(MultiversionConcurrencyControl,MVCC)机制来支持高效并发处理。MVCC是一种在数据库中处理并发事务的方法,可以提供高并发和隔离性。本文将深入解析MySQLMVCC的原理与实现,并结合代码示例进行说明。一、M

深入理解MyBatis中的批量Insert实现原理 深入理解MyBatis中的批量Insert实现原理 Feb 21, 2024 pm 04:42 PM

MyBatis是一款流行的Java持久层框架,广泛应用于各种Java项目中。其中,批量插入是一个常见的操作,可以有效提升数据库操作的性能。本文将深入探讨MyBatis中的批量Insert实现原理,并结合具体的代码示例进行详细解析。MyBatis中的批量Insert在MyBatis中,批量Insert操作通常使用动态SQL来实现。通过构建一条包含多个插入值的S

深度解析Linux chage命令的功能与工作原理 深度解析Linux chage命令的功能与工作原理 Feb 24, 2024 pm 03:48 PM

Linux系统中的chage命令是用来修改用户账号的密码失效日期的命令,也可以用来修改账号的最长和最短可用日期等。该命令在管理用户账号安全上起到非常重要的作用,可以有效地控制用户密码的使用期限,增强系统的安全性。chage命令的使用方法:chage命令的基本语法为:chage[选项]用户名例如,要修改用户“testuser”的密码失效日期,可以使用以下命

MyBatis分页插件原理详解 MyBatis分页插件原理详解 Feb 22, 2024 pm 03:42 PM

MyBatis是一个优秀的持久层框架,它支持基于XML和注解的方式操作数据库,简单易用,同时也提供了丰富的插件机制。其中,分页插件是使用频率较高的插件之一。本文将深入探讨MyBatis分页插件的原理,并结合具体的代码示例进行说明。一、分页插件原理MyBatis本身并不提供原生的分页功能,但可以借助插件来实现分页查询。分页插件的原理主要是通过拦截MyBatis

深入解析Struts2框架的工作原理与实现方式 深入解析Struts2框架的工作原理与实现方式 Jan 05, 2024 pm 04:08 PM

解读Struts2框架的原理及实现方式引言:Struts2作为一种流行的MVC(Model-View-Controller)框架,被广泛应用于JavaWeb开发中。它提供了一种将Web层与业务逻辑层分离的方式,并且具有灵活性和可扩展性。本文将介绍Struts2框架的基本原理和实现方式,同时提供一些具体的代码示例来帮助读者更好地理解该框架。一、框架原理:St

Golang实现继承方法的基本原理和方式 Golang实现继承方法的基本原理和方式 Jan 20, 2024 am 09:11 AM

Golang继承方法的基本原理与实现方式在Golang中,继承是面向对象编程的重要特性之一。通过继承,我们可以使用父类的属性和方法,从而实现代码的复用和扩展性。本文将介绍Golang继承方法的基本原理和实现方式,并提供具体的代码示例。继承方法的基本原理在Golang中,继承是通过嵌入结构体的方式实现的。当一个结构体嵌入另一个结构体时,被嵌入的结构体就拥有了嵌

See all articles