PHP文件上传原理简单分析

2019-07-26 10:48栏目:编程学习

//表单上传只可以接纳multipart/form-data编码格式
$_FILES系统函数;
$_FILES['myFile']['name']文件名称
$_FILES['myFile']['type']文件的品种,服务端进行限定
image/**
image/x-png
application/x-zip-compressed
$_FILES['myFile']['size']上传文件大小
$_FILES['myFile']['tmp_name']上传服务后保存不经常文件名
$_FILES['myFile']['error']错误代码;
0成功1超过php.ini大小2超过MAX_FILE_SIZE选项钦点的值
3独有一点上传 5上传文件大小为0

一,相比简单的实现文件上传

move_uploaded_file(有时文件,目的地点和文件名);
上传后移动文件到指标地方的函数
is_uploaded_file(MIME);
推断上传MIME类型的文书函数

文本上传原理

复制代码 代码如下:

文本上传原理:将客户端的文件先上传到服务器端,然后再将服务器端的不时文件移动到内定的目录。

<form enctyoe="multipart/form-data" method="post" name="upload">
<input name="upfile" name="name">
</form>
if(is_uploaded_file($_FILES['myFile']['tmp_name'])){
$upfile = $_FILES['upload'];
$name = $upfile['name'];
$type = $upfile['type'];
$size = $upfile['size'];
$tmp_name = $upfile['tmp_name'];
$error = $upfile['error'];
switch($type){
case 'image/pjpeg' : $ok=1;
break
}
if($ok){
move_uploaded_file($tmp_name,'up/'.$name);
}else{
echo "文件类型分裂意";
}
}

客户端配置

您可能感兴趣的小说:

  • php多文件上传完成代码
  • php jquery 多文件上传轻便实例
  • php文件上传的事例及参数详解
  • 归纳的php文件上传(实例)
  • php文件上传的简要实例
  • PHP设置图片文件上传大小的现实贯彻格局
  • PHP文件上传首要代码解说
  • PHP 文件编程综合案例-文件上传的贯彻
  • 与公事上传有关的php配置参数总括
  • php多文件上传功效完毕原理及代码
  • php 文件上传实例代码
  • php利用iframe完成无刷新文件上传作用的代码
  • php 文件上传类代码
  • PHP文件上传后缀名与文件类型对照表整理
  • php中经过Ajax如何达成异步文件上传的代码实例
  • File, FileReader 和 Ajax 文件上传实例解析(php)
  • php中有关常见表单多文件上传的拍卖方法
  • php多文件上传下载示例分享

要上传文件,我们必要动用表单,并且表单发送的花样来POST央浼,何况要求将enctype设置为multipart/form-data,总计上传的原则如下:

浏览器表单页面

表单发送格局为post
指定enctype=multipart/form-data
客户端的代码:

<form action="uploadFile.php" method="post" accept-charset="utf-8" enctype="multipart/form-data">
    请选用要上传的公文:
    <input type="file" name="myfile">
    <input type="submit" value="上传文件">
</form>
 
$_FILES文件变量

上边是上传一个图纸然后打字与印刷整理出来的数目:

 
// name => 'QC8054R7QPGQ_1000x500.jpg'
// type => 'image/jpeg'
// tmp_name => '/Applications/MAMP/tmp/php/php1X5KZU'
// error => 0
// size => 229936
 
$_FILES上传的参数含义表达:

name:上传的公文的名目
type: 上传的文书的MIME类型
tmp_name:文件上盛传服务器的一时半刻路线
site:上传的文书的深浅
error:上传的文件的错误码,0象征上传成功UPLOAD_ERR_OK

移动文件

运动文件措施一
上传文件到服务器端是在贰个如今路线下,大家须求将文件移动到钦赐的目录下,咱们得以经过上边包车型的士函数来贯彻移动:

 

// 将点名的文书移到的目录路径下
// 需要待移动的公文是通过HTTP POST上传的
bool move_uploaded_file ( string $filename , string $destination )
 
我们必要看清一下是否是通过HTTP POST上传的,上面包车型大巴办法能够推断:

 
// 剖断文件是不是是通过HTTP POST上传的,假诺是重返TRUE,不然再次来到FALSE
bool is_uploaded_file ( string $filename )
 
移动文件措施二

大家还是可以经过上边包车型大巴函数来兑现活动文件:

// 参数一:待移动的文件
// 参数二:移动到的靶子路线
bool copy ( string $source , string $dest [, resource $context ] )
 
拍卖上传

 
<?php
 
define('UPLOAD_PATH', 'Uploads');
 
$name = $_FILES['myfile']['name'];
$type = $_FILES['myfile']['type'];
$tmp_name = $_FILES['myfile']['tmp_name'];
$error = $_FILES['myfile']['error'];
$size = $_FILES['myfile']['size'];
 
if ($error == UPLOAD_ERR_OK) {
    if (is_uploaded_file($tmp_name)) {
        move_uploaded_file($tmp_name, UPLOAD_PATH . '/' . $name);
    } else {
        if (is_file($tmp_name) && !copy($tmp_name, UPLOAD_PATH . '/' . $name)) {
            var_dump('ok');
        }
    }
} else {
    // 上传播服务器就已经出错了
    var_dump($error);
}
 
php.ini上传配置

假如我们要协助上传20M的公文,那么大家得以设置以下选项:

 
// 必定要设置为On,技巧上传文件,若设置为Off,则服务器是收取不到文件数量的
file_uploads = On
 
// 钦命上传文件到服务器的有时目录,默以为不张开的,能够不写
upload_tmp_dir = "d:/uploads_tmp"
 
// 协理上传的公文的最大为20M
upload_max_filesize = 20M
 
// 设置POST央浼允许二回呼吁的最大值为100M
post_max_size = 100M
 
// 上传操作允许的最长日子,当先600秒则会停下脚本运转,0意味无界定
max_execution_time = 600
 
// PHP脚本解析呼吁数据所用的最大日子,默以为60秒,0意味着无界定
max_input_time = 600
 
// 单个PHP脚本所能申请的最大内部存款和储蓄器,-1象征无界定!
memory_limit = 128M
 
上传文件错误码
UPLOAD_ERR_OK:代表上传成功
UPLOAD_ERR_EXTENSION:上传的文件被PHP扩张程序中断
UPLOAD_ERR_PARTIAL:文件独有局地被上传
UPLOAD_ERR_CANT_W奥迪Q5ITE:文件写入败北
UPLOAD_ERR_FORM_SIZE:表单文件超越了post_max_size
UPLOAD_ERR_INI_SIZE:文件大小超越了限定上传的深浅
UPLOAD_ERR_NO_FILE:没有公文被上传
UPLOAD_ERR_NO_TMP_DIENCORE:找不到不常目录

客户端限制上传

作者们得以因此遮盖域来贯彻限制上传的文件大小,同期可以通过accept来限制上传的文件的档期的顺序,如下所示:

 
<form action="uploadFile.php" method="post" accept-charset="utf-8" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="1024">
    请接纳要上传的文件:
    <input type="file" name="myfile" accept="image/png">
    <input type="submit" value="上传文件">
</form>
 
服务端限制上传

咱俩得以由此在服务端来剖断文件类型、文件大小,上传格局等来推断是否满意条件,然后才管理公事!

 
<?php
 
define('UPLOAD_PATH', 'Uploads');
define('MAX_FILE_SIZE', 2 * 1024 * 1024);
 
header('Content-type:text/html;Charset=utf-8');
 
$name = $_FILES['myfile']['name'];
$type = $_FILES['myfile']['type'];
$tmp_name = $_FILES['myfile']['tmp_name'];
$error = $_FILES['myfile']['error'];
$size = $_FILES['myfile']['size'];
 
$allowExt = array('png', 'jpg', 'jpeg');
 
if ($error == UPLOAD_ERR_OK) {
    if ($size > MAX_FILE_SIZE) {
        exit('上传的文件过大');
    }
 
    // 取上传的文本的扩大项目
    $ext = pathinfo($name, PATHINFO_EXTENSION);
    if (!in_array($ext, $allowExt)) {
        exit('非菲律宾语件类型');
    }
 
    if (!is_uploaded_file($tmp_name)) {
        exit('文件不是HTTP POST上传过来的');
    }
 
    if (move_uploaded_file($tmp_name, UPLOAD_PATH . '/' . $name)) {
        echo '文件上传成功';
    } else {
        echo "文件上传战败";
    }
} else {
    // 上盛传服务器就早就出错了
    var_dump($error);
}
 
大体文件重名之类的难题,这一个必要格外加多一些小拍卖啊!

二,上传文件类

<?php
 
ini_set('display_errors', 'On');
error_reporting(E_ALL);
header('Content-type:text/html;Charset=utf-8');
 
/**
* Class for Uploading a single image 
*/
class Upload {
    protected $fileName; /* eg, $_FILES['file'], the name is file. */
    protected $allowExt; /* Allow extension for uploading a file */
    protected $allowMIMEType;      /* Allow uploading file mine types */
    protected $fileMaxSize; /* Limit a uploading file size */
    protected $uploadPath;  /* The destination path */
    protected $isImageFlag;     /* Note that file is an image or not. */
    protected $errorMessage;   
    protected $fileExt;
    protected $fileInfos;
    protected $fileUniqueName;
    protected $fileDestPath;
 
    public function __construct($fileName = 'file', $uploadPath = './Uploads', $isImageFlag = true, $fileMaxSize = 1048576, $allowExt = array('png', 'jpg', 'jpeg', 'gif'), $allowMIMEType = array('image/png', 'image/jpeg', 'image/gif')) {
        $this->fileName = $fileName;
        $this->allowExt = $allowExt;
        $this->allowMIMEType = $allowMIMEType;
        $this->uploadPath = $uploadPath;
        $this->isImageFlag = $isImageFlag;
        $this->fileMaxSize = $fileMaxSize;
        // print_r($_FILES);
        $this->fileInfos = $_FILES[$fileName];
    }
 
    public function uploadFile() {
        if ($this->isValidExt()
            && $this->isValidMIMEType()
            && $this->isValidFileSize()
            && $this->isRealImage()
            && $this->isHTTPPOST()
            && !$this->hasError()) {
            $this->isUploadPathExist();
            $this->fileUniqueName = $this->getUniqueName();
            $this->fileDestPath = $this->uploadPath . '/' . $this->fileUniqueName . '.' . $this->fileExt;
// echo iconv('gb2312', 'UTF-8', $this->fileDestPath);
            if (@move_uploaded_file($this->fileInfos['tmp_name'], $this->fileDestPath)) {
                return $this->fileDestPath;
            } else {
                $this->errorMessage = '文件上传失利';
            }
        } else {
            $this->errorMessage = '文件上传退步';
        }
 
        exit('<span style="color:red">'.$this->errorMessage.'</span>');
    }
 
    protected function hasError() {
        $ret = true;
 
        if (!is_null($this->fileInfos)) {
            switch ($this->fileInfos['error']) {
                case UPLOAD_ERR_INI_SIZE:
                   $this->errorMessage = '文件大小超过PHP.ini文件中upload_max_filesize';
                   break;
                case UPLOAD_ERR_FORM_SIZE:
                    $this->errorMessage = '文件大小超过了表单中MAX_FILE_SIZE设置的值';
                    break;
                case UPLOAD_ERR_NO_TMP_DIR:
                    $this->errorMessage = '找不到不经常文件目录';
                    break;
                case UPLOAD_ERR_NO_FILE:
                    $this->errorMessage = '没有选取其余公文上传';
                    break;
                case UPLOAD_ERR_CANT_WRITE:
                    $this->errorMessage = '文件不可写';
                    break;
                case UPLOAD_ERR_PARTIAL:
                    $this->errorMessage = '独有一点文件被上传';
                    break;
                case UPLOAD_ERR_EXTENSION:
                    $this->errorMessage = '文件上传进度中被PHP扩张程序中断';
                    break;
                default:
                    $this->errorMessage = '';
                    $ret = false;
            }
        } else {
            $this->errorMessage = '文件上盛传错';
        }
 
        return $ret;
    }
 
    protected function isValidFileSize() {
        if ($this->fileInfos['size'] > $this->fileMaxSize) {
            $this->errorMessage = '文件太大';
            return false;
        }
 
        return true;
    }
 
    protected function isValidExt() {
        $ext = pathinfo($this->fileInfos['name'], PATHINFO_EXTENSION);
        if (!in_array($ext, $this->allowExt)) {
            $this->errorMessage = '不协理的文件类型';
            return false;
        }
 
        $this->fileExt = $ext;
        return true;;
    }
 
    protected function isValidMIMEType() {
        $type = $this->fileInfos['type'];
 
        if (!in_array($type, $this->allowMIMEType)) {
            $this->errorMessage = '不扶助的文本MIME类型';
            return false;
        }
 
        return true;
    }
 
    protected function isHTTPPOST() {
        if (!is_uploaded_file($this->fileInfos['tmp_name'])) {
            $this->errorMessage = '文件不是透过HTTP POST传上来的';
 
            return false;
        }
 
        return true;
    }
 
    protected function isRealImage() {
        if ($this->isImageFlag && !getimagesize($this->fileInfos['tmp_name'])) {
            $this->errorMessage = '文件不是图形';
            return false;
        }
 
        return true;
    }
 
    protected function isUploadPathExist() {
        if (!file_exists($this->uploadPath)) {
            mkdir($this->uploadPath, 0777, true);
        }
    }
 
    protected function getUniqueName() {
        return md5(microtime(true), true);
    }
}
 
$upload = new Upload('myfile');
if ($upload->uploadFile()) {
    echo "文件上传成功";
}

版权声明:本文由威尼斯人app发布于编程学习,转载请注明出处:PHP文件上传原理简单分析