首页 > Web开发 > 详细

PHP 文件上传

时间:2020-02-24 09:52:45      阅读:68      评论:0      收藏:0      [点我收藏+]

一、环境配置

1、如何快速查找php.ini文件

调用 函数phpinfo() 查看


2、php.ini 中与文件上传有关的配置项

配置 说明
file_uploads 是否允许上传文件,On开启 Off禁止上传
upload_tmp_dir 文件上传过程中临时保存的目录,默认保存位置为 /tmp
upload_max_filesize 允许上传的最大文件大小,可以使用 K、M、G单位如 2M
post_max_size PHP将接受的最大POST数据大小,包括上传文件、表单数据。所以post_max_size要大于 upload_max_filesize
max_file_uploads 单个请求时,允许上传的最大文件数量
  • 其中upload_max_filesize 设置项限制的是单个文件上传的大小
  • 更改php.ini中配置之后需要重启==集成开发坏境或apache才会生效==

3、文件上传的简单实现

<form action="01.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="">
    <button>提交</button>
</form>
<?php

header("Content-Type: text/html;charset=utf-8");
var_dump($_FILES['file']);

超全局数组:$ _ FILES

  • 又被称为预定义变量
    • 具有超越一般数组的访问权限,以保证能被随时访问
    • $ _ FILES 中保留关于上传文件的信息,唯一 一个PHP自带的二维数组(通常将input name属性作为关键字)
    • 一个一维元素保存一个上传文件的信息,通过对数组的操作可以完成对上传文件的操作
  • $_FILES [‘input_name‘]
    • 其中input_name为input的name属性值
    • $_FILES [‘input_name‘][‘name‘] :原始上传文件名
    • $_FILES [‘input_name‘][‘type‘] :上传文件的mime类型
    • $_FILES [‘input_name‘][‘tmp_name‘]:上传文件保存的临时目录
    • $_FILES [‘input_name‘][‘error‘] :上传错误信息
    • $_FILES [‘input_name‘][‘size‘]:以字节为单位表示的文件的大小
array(5) {
  ["name"]=>
  string(8) "nmap.bat"
  ["type"]=>
  string(24) "application/octet-stream"
  ["tmp_name"]=>
  string(47) "C:\Users\lanying\AppData\Local\Temp\php8CEA.tmp"
  ["error"]=>
  int(0)
  ["size"]=>
  int(7)
}

错误说明

上传出错会在$_FILES[‘error‘] 选项中体现,具体错误说明如下:

错误 错误码 说明
UPLOAD_ERR_OK 0 没有错误发生
UPLOAD_ERR_INI_SIZE 1 上传的文件超过了 php.ini 中 upload_max_filesize

错误 错误码 说明
UPLOAD_ERR_FORM_SIZE 2 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值
UPLOAD_ERR_PARTIAL 3 文件只有部分被上传
UPLOAD_ERR_NO_FILE 4 没有文件被上传
UPLOAD_ERR_NO_TMP_DIR 6 找不到临时文件夹
UPLOAD_ERR_CANT_WRITE 7 文件写入失败

4、 多文件上传

name 使用数组作为属性值

<form action="02.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file[]" id="">
    <input type="file" name="file[]" id="">
    <input type="file" name="file[]" id="">
    <button>提交</button>
</form>
<?php

var_dump($_FILES['file']);

// var_dump($_FILES['file']['type'][1]);

输出结果:

array(5) {
  ["name"]=>
  array(3) {
    [0]=>
    string(12) "README-WIN32"
    [1]=>
    string(12) "python27.dll"
    [2]=>
    string(12) "README-WIN32"
  }
  ["type"]=>
  array(3) {
    [0]=>
    string(24) "application/octet-stream"
    [1]=>
    string(0) ""
    [2]=>
    string(24) "application/octet-stream"
  }
  • 多文件上传时,$_FILES 变为一个三维数组

($_FILES[‘file‘][‘type‘][1] 获取上传第二个文件的文件类型


5、上传安全问题

bool is_uploaded_file ( string $filename )

  • 检查文件是否通过HTTP POST上传
  • is_uploaded_file($FILES[‘input_name‘][‘tmp_name‘]);

bool move_uploaded_file ( string $filename , string $destination )

  • 如果上传文件不进行移动,在脚本执行结束时会被自动删除,只有移动文件才能获得$_FILES的相关信息同时避免被删除
  • Move_uploaded_file($FILES[‘input_name‘][‘tmp_name‘],‘文件命名和保存地址‘);

6、基础语法补充

PHP中的数组形式

  1. 索引数组

  2. 关联数组

    关联数组中的键标记为 =>

  3. $result[] 默认从第0个元素开始迭代

foreach语句的两种格式

$msg = [
    'name' => 'wukong',
    'age' => 500
];

foreach($msg as $value){
    echo $value; // wukong500
} // 此时只迭代值

echo "<br></br>";
foreach($msg as $key => $value){

} // 同时迭代键和值

PHP中的文件操作

? mkdir( string $pathname[, int $mode = 0777[, bool $recursive=FALSE [, resource $context ]]] ) : bool

  • mkdir() 函数 根据传入的路径常见目录

  • mode参数在Windows下被忽略

  • 第三个参数选择是否设置递归模式

is_dir( string $filename) : bool

  • 判断输入的字符串是否是一个目录(判断一个目录是否已经存在)

pathinfo($_FILES[ ‘file‘] [‘name‘]);

  • 返回值是一个关联数组
  • $_FILES[‘file‘] [‘name‘] [‘extension‘];
array(4) {
  ["dirname"]=>
  string(1) "."
  ["basename"]=>
  string(22) "3rd-party-licenses.txt"
  ["extension"]=>
  string(3) "txt"
  ["filename"]=>
  string(18) "3rd-party-licenses"
}

// 通常用扩展名这个属性

7、封装上传类

目标:能够处理单文件上传也能够处理多文件上传

<form action="controller.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="">
    <input type="file" name="files[]" id="">
    <input type="file" name="files[]" id="">
    <button>提交</button>
</form>

makeDir() 判断uploads文件夹是否存在,不存在则创建

format() 函数 将单文件上传和多文件上传时的文件信息保存入一个二维数组

make() 函数对上传文件进行移动和校验

<?php

class Uploader{
    public function make(){
        $path = $this->makeDir();
        $files = $this->format();
        foreach ($files as $file) {
            if($file['error'] == 0){
                if(is_uploaded_file($file['tmp_name'])){
                    $ex = pathinfo($file['name'])['extension'];
                    move_uploaded_file($file['tmp_name'],$path."/".mt_rand(1,9999).".".$ex);
                }
            }else{
                echo "上传失败";
            }
        }
        var_dump($files);

    }
    // TODO:foreach 语句
    private function format(){
        // 对数组中存有数据的格式化:将三维数组和二维数组中存有的信息统一存入一个二维数组
        // 定义一个数组存储信息
        $files = [];
        foreach($_FILES as $file){
            if(is_array($file['name'])){
                // 对三位数组进行遍历,一个上传文件的信息作为一个一维数组的元素
                foreach($file['name'] as $id => $value){
                    $files[] = [
                        'name' => $file['name'][$id],
                        'type' => $file['type'][$id],
                        'error' => $file['error'][$id],
                        'tmp_name' => $file['tmp_name'][$id],
                        'size' => $file['size'][$id]
                    ]; // 数组不写下标时默认从0开始一直往下迭代
                }
            }else{
                $files[] = $file;
            }
        }
        return $files;
    }
    // 如果没有上传文件目录就建立
    public function makeDir(){
        $path = 'uploads/'.date('Y-m-d');
        is_dir($path) or mkdir($path,0755,true);
        return $path;
        // TODO 文件操作函数
    }
}

PHP 文件上传

原文:https://www.cnblogs.com/lanying0/p/12355627.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!