PHP之上传与下载

0x00 上传

  • 客户端设置
    客户端使用form表单上传文件,在form表单中必须指明enctype和method属性的值

    <html>
    <head>
    <title>post</title>
    </head>
    <body>
    <form action="xx.php" mothod="post" enctype="multipart/form-data">
        <input type="file" value="myfile" /><br />
        <input type="submit" value="提交" />
    </form>
    </body>
    </html>
    
  • 服务端设置

    • php.ini:

      file_uploads = On   //默认允许HTTP文件上传,此选项不能设置为OFF
      upload_tmp_dir=    //文件上传时存放文件的临时目录
      upload_max_filesize = 20M   //设定单个文件上传的大小,必须小于post_max_size
      post_max_size = 19M   //允许POST表单的数据最大大小
      
    • $_FILES:

      $_FILES['upload_file']['name']  //带扩展名的原始文件名
      $_FILES['upload_file']['size']  //文件大小
      $_FILES['upload_file']['tmp_name']  //临时文件名
      $_FILES['upload_file']['error']  //上传文件时的错误信息
      $_FILES['upload_file']['type']  //上传文件的类型
      
      //type是上传文件时原始信息里的content_type,即MIME,有image/gig、text/html等
      //error一般有5中类型:
      //0 上传成功
      //1 文件大小超过了upload_max_filesize
      //2 文件大小超过了表单总MAX_FILE_SIZE设定的值
      //3 只有部分被上传
      //4 没有上传任何文件
      
    • 服务端上传步骤

      1、判断uploads这个文件夹存在
      2、判断error的值
      3、判断文件后缀是否合法
      4、判断MIME的类型和子类型是否合法
      5、判断文件大小
      6、对文件进行重命名
      7、移动
      
    • 服务端接收脚本

      <?php
      //执行文件(图片)上传
      echo "<pre>";
      var_dump($_FILES);
      echo "</pre>";
      
      //1.获取上传文件信息
       $upfile = $_FILES["pic"]; //html的form表单的input中name属性值要为pic
       $typelist = array("image/jpeg","image/jpg","image/png","image/gif"); //定义允许的类型
       $path="./uploads/";  //定义一个上传过后的目录
      
      //2. 过滤上传文件的错误号
      if($upfile["error"]>0){
          //获取错误信息
          switch($upfile['error']){
              case 1:
                  $info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。"; 
                  break;
              case 2:
                  $info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。"; 
                  break;
              case 3:
                  $info="文件只有部分被上传。"; 
                  break;
              case 4:
                  $info="没有文件被上传。 ";
              case 6:
                  $info="找不到临时文件夹。"; 
                  break;
              case 7:
                  $info="文件写入失败"; 
                  break;
          }
      
          die("上传文件错误,原因:".$info);
      }
            
      //3. 本次上传文件到小的过滤(自己选择)
      if($upfile["size"]>100000){
          die("上传文件大小超出限制!");
      }
              
      //4. 类型过滤
      if(!in_array($upfile["type"],$typelist)){
          die("上传文件类型非法!".$upfile["type"]);
      }
      
      //5. 上传后的文件名定义(随机获取一个文件名(保持后缀名不变))
      $fileinfo = pathinfo($upfile["name"]);//解析上传文件名字
      do{
          $newfile= date("YmdHis").rand(1000,9999).".".$fileinfo["extension"];
      }while(file_exists($path.$newfile));
      //6. 执行文件上传
      //判断是否是一个上传的文件
      if(is_uploaded_file($upfile["tmp_name"])){
          //执行文件上传(移动上传文件)
          if(move_uploaded_file($upfile["tmp_name"],$path.$newfile)){
              echo "文件上传成功!";
              echo "<h3><a href='index.php'>浏览</a></h3>";
          }else{
              die("上传文件失败");
          }
      }else{
          die("不是一个上传文件!");
      }
      ?>
      

0x01 下载

  • 对于php无法解析的类型

    <a href="http://www.aa.com/xx.rar">下载</a >
    
  • 对于php能解析的文件(同时为了安全性)

    <?php
    header("Content-type:text/html;charset=utf-8");
    $file_name = "文件.exe";
    $file_name=iconv("utf-8","gb2312",$file_name); //解决中文不能显示的问题 
    $file_dir = "/public/www/download/";
    $file_path = $file_dir.$file_name;
    if (!file_exists($file_path)) { //检查文件是否存在
        echo "文件找不到";
        exit;
    } else {
        $file = fopen($file_path,"r"); // 打开文件
        Header("Accept-Ranges: bytes");//代表支持断点续传
        // 输入文件标签,下面3个Header是必须的
        Header("Content-type: application/octet-stream");
        Header("Accept-Length: ".filesize($file_path));
        Header("Content-Disposition: attachment; filename=" . $file_name);
        // 输出文件内容
        echo fread($file,filesize($file_path));
        fclose($file);
        exit;
    }
    ?> 
    
若未作声明则文章版权归本人(@reber)所有,转载请注明原文链接:

可以返回顶部