PHP实战PHP经验分享

GET请求和POST请求、文件上传操作

2019-02-20  本文已影响6人  羽翼的翼

GET请求和POST请求

文件上传遵循的流程:
选取文件提交 ==> 存入服务器暂存区 ==> 有后续操作后存入到服务器

步骤1:在表单中提交

☆ 在php中文件上传必须得是post请求

☆ 必须给表单设置enctype属性

/*
    1, 必须给表单设置enctype属性
        application/x-www-form-unlencoded    将参数编码为键值对的格式,标准格式
            (UTF-8 GBK GB2312)  用来处理字符串,默认的编码格式 
        multipart/form-data   专门用来处理特殊文件,比如文件
*/
<form action=<?php echo $_SERVER['PHP_SELF'] ?> method="post" enctype="multipart/form-data">
    文件选择: <input type="file" name="myFile"> <br>
    <input type="submit">
</form>

步骤2:在php代码中接收

☆ 1. 在php中,上传之后的相关信息都存储在$_FILES 超全局变量中

☆ 2.使用一个方法来实现文件的移动,否则文件将在程序结束后被自动遗弃

☆ 3.move_uploaded_file(源文件的全路径, 目标文件的全路径)

☆ 4.文件夹是手动创建的

<?php
    // 在php中,上传之后的相关信息都存储在 $_FILES 超全局变量中
    print_r($_FILES)
    /*
        Array(
            [myFile] => Array(
                [name] => xxx.jpg   (源文件的名称)
                [type] => image/png  (源文件的类型)
                [tmp_name] => C:\windows\phpE412.tmp   (保存文件的路径)
                [error] => 0
                [size] => 256436
            )
        )
    */
  
  // 使用一个方法来实现文件的移动,否则文件将在程序结束后被自动遗弃
  // move_uploaded_file(源文件的全路径, 目标文件的全路径)
  // 文件夹是手动创建的
  move_uploaded_file($_FILES["myFile"]["tmp_name"], "./upload/temp.png")
?>

补充说明(1)

由于发送的是post请求,结果文件一打开的时候就开始了一些操作,发现报错了
所以,在打开文件的时候,还得需要一些判断

<?php
    // 判断当前的数组是否为空,为空则不进入
    if(!empty($_FILES)) {
        move_uploaded_file($_FILES["myFile"]["tmp_name"], "./upload/temp.png")
    }
?>
  
// !!!通过表单元素的属性,限制文件上传的格式
  
// 1, 在表单元素中可以限制
<input type="file" accept=".jpg,.png" /> 
  
// 2, 在后端进行判断
<?php
    if(!empty($_FILES)) {
        
        $type = $_FILES["myFile"]["type"];
        // *****  strpos(源字符,搜索字符)  可以获取指定字符串在源字符中第一次出现的索引
        if(strpos($type, "image/") === 0) {
            move_uploaded_file($_FILES["myFile"]["tmp_name"], "./upload/temp.png");
        }else {
            echo "您选择的不是一张图片";
        }
    }
?>

文件名称不固定,设置合理的文件名称

<?php
    // 获取当前文件的名称
    $fileName = $_FILES["myFile"]["name"];
    // 拼接文件的名称
    // move_uploaded_file($_FILES["myFile"]["tmp_name"], "./upload/".$fileName);
    // ???? 如果两次都是一次名字,很有可能重名,然后会覆盖之前的文件

    // 生成随机数,时间是唯一的
    // $myname = time();

    // strrchr(源字符串,指定搜索的字符串)
    $extension = strrchr($fileName, "."); // 如果是 demo.png , 就能获取到后面的 .png
    $myname = time().rand(1000, 9999).$extension; // 得到一个随机的唯一的值, 还带扩展名
?>
上传文件.jpg

补充说明(2)

当上传的文件比较大的时候,会出不来想要的效果
而此时,得到的$_FILES数组中,error指向的值为1
根据查询手册得知,这里的意思指的是,上传的文件超出了大小
如果需要修改大小的范围,需要修改配置文件

strlen.jpg
搜索相关的信息
maxload.jpg
得到对应的位置之后,发现默认为2M的大小
modefieLoad.jpg
修改完毕之后,一定要记得重启服务器!!!

服务器对每一次post请求传递做了限制,默认为8M
可以修改配置文件,改大对应的值,搜索post_max_size
和上图操作类似 找到 php-ini配置
找到位置后,该变原有的大小

补充说明(3)

同时上传多个文件
在选择的表单元素中加入multiple, 则可以选中多个文件
<input type="file" name="myfile" multiple>

1.0 如果需要后端服务器的 $_FILES 接收多个文件,则需要在name属性值后面加上[ ]

<input type="file" name="myfile[]" multiple>

2.0 实现完成效果

<?php
  /*
    Array(
        [myfile] => Array(
            [name] => Array(
                [0] => 11.png
                [1] => 111222.jpg
            )
            [tmp_name] => Array(
                [0] => C:\Windows\phpc51.tmp
                [1] => C:\Windows\phpc62.tmp
            )
        )
    )
  */
  
  if(!empty($_FILES)) {
        // 获取扩展名的数组
        $nameArr = $_FILES["myfile"]["name"];
        $pathArr = $_FILES["myfile"]["tmp_name"];
        foreach($pathArr as $key => $value) {
            // 获取唯一的图片名称
            $name = time().rand(1000, 9999).strrchr($nameArr[$key], ".");
            // 将文件存储到永久目录  move_upload_file
            move_upload_file($value, "./upload/".$name);
        }   
  }
?>
上一篇下一篇

猜你喜欢

热点阅读