PHP服务端开发入门——11、PHP文件上传

444 阅读1分钟

PHP文件上传

本节介绍

  • 上传文件的form表单
  • 全局数组$_FILES
  • move_uploader_file函数

1. FORM表单的设置

  • FORM表单发送文件时,由于数据量较大,需要使用POST方式提交
  • FORM元素的enctype属性需要设置为multipart/form-doato,传输的数据要用到多媒体传输协议
  • enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是application/x-www-form-urlencoded,此种方式在表单发送之前会将内容进行urlencode编码
  • input的type属性设置为file:<input type="file" name="file" />
  • 示例:
    • <!DOCTYPE html>
      <html>
      <head>
          <title>Upload a file</title>
          <mata chartset="UTF-8" />
      </head>
      <body>
          <form action="upload.php" method="post" enctype="multipart/form-data" target="blank">
              Select file:<input type="file" name="file" />
              <br />
              <input type="submit" name="提交" />
          </form>
      </body>
      </html>
      

2. 全局数组$_FILES

  • PHP所通过全局数组$_FILES接收客户端上传的文件信息
  • $_FILES至少为二维数组
  • 第一层数组的key为选择文件框input的name值,第二层数组的key包括:
    • 被上传文件的名称:$_FILES["file"]["name"]
    • 被上传文件的类型:$_FILES["file"]["type"]
    • 被上传文件的大小,以字节计:$_FILES["file"]["size"]
    • 存储在服务器的文件的临时副本的名称:$_FILES["file"]["tmp_name"]
    • 由文件上传导致的错误代码:$_FILES["file"]["error"]
  • 示例:
    • 查看$_FILES结构:

    • <?php
      
      //接收客户端发来的文件,然后保存
      var_dump($_FILES) ;  
      
      ?>
      

    • 查看$_FILES结构:

    • <?php
      
      //接收客户端发来的文件,然后保存
      //var_dump($_FILES) ;
      
      echo "name:".$_FILES["file"]["name"]."<br/>" ;
      echo "type:".$_FILES["file"]["type"]."<br/>" ;
      echo "size:".$_FILES["file"]["size"]."<br/>" ;
      
      ?>
      

3. move_uploader_file函数

  • move_uploader_file()函数将上传的文件移动到新位置。如果成功,返回true,否则返回false
  • 此函数仅用于通过HTTP POST上传的文件
  • 如果目标文件已经存在,将会被覆盖
  • 示例:
    • <?php
      
      //上传文件
      if ($_FILES["file"]["error"]) {
      
          echo "上传出错<br/>" ;
      } else {
      
          $result = move_uploaded_file($_FILES["file"]["tmp_name"], "1.png") ;
          if ($result) {
              echo "保存成功!" ;
          } else {
              echo "保存失败!" ;
          }
      }
      
      ?>
      

4. 上传多个文件

  • 上传多个文件和一个文件都使用$_FILES来接收文件信息
  • 上传多个文件时$_FILES为三维数组
  • $_FILES["file"]["name"]是一个索引数组,存储所有上传文件的文件名
  • FORM表单中input的name属性值后必须添加[]<input type="file" name="file[]" />
  • 示例:
    • FORM表单:

    • <!DOCTYPE html>
      <html>
      <head>
          <title>Upload multiple files</title>
          <mata chartset="UTF-8" />
      </head>
      <body>
          <form action="uploads.php" method="post" enctype="multipart/form-data" target="blank">
              file1:<input type="file" name="file[]" /><br />
              file2:<input type="file" name="file[]" /><br />
              file3:<input type="file" name="file[]" /><br />
      
              <input type="submit" name="提交" />
          </form>
      </body>
      </html>
      
    • 查看$_FILES结构:

    • <?php
      
      //接收客户端发来的文件,然后保存
      //第一层数组包含1个元素——key=file
      //第二层数组包含5个元素——key=name, tmp_name, type, size, error
      //第三层数组是索引数组,包含多个文件的信息
      var_dump($_FILES) ;
      
      ?>
      

    • 上传多个文件:

    • <?php
      
      //上传多个文件
      for ($i=0; $i < count($_FILES["file"]["name"]); $i++) {
          //上传第i个文件
          $j = $i + 1 ;
          if ($_FILES["file"]["error"][$i]) {
      
              echo "上传第 $j 个文件出错!<br />" ;
          } else {
      
              $result = move_uploaded_file($_FILES["file"]["tmp_name"][$i], $j."00.png") ;
              if ($result) {
      
                  echo "上传第 $j 个文件成功!<br />" ;
              } else {
      
                  echo "上传第 $j 个文件出错!<br />" ;
              }
          }
      }
      
      ?>