学科分类
目录
PHP基础

单文件上传

使用表单可以进行文件上传,在使用时,需要设置enctype属性。enctype属性用来指定表单数据的编码方式,默认值为application/x-www-form-urlencoded,但由于这种方式无法进行文件上传,所以我们需要将其设为multipart/form-data,示例代码如下。

  <form action="表单提交地址" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="上传" />
  </form>

PHP会将从表单中接收到的数据保存在超全局数组$_POST中,但是使用$_POST接收到的文件信息仅包含文件的名称。对于从表单中接收到的上传文件,服务器会将其保存在服务器默认的上传文件临时目录中,我们可以使用超全局变量$_FILES来获取临时文件中的信息。$_FILES数组中保存了文件的5个信息,具体如下。

  • name:客户端文件的原名称。
  • type:文件的MIME类型,需要浏览器提供该信息的支持,如“image/gif”。
  • size:上传文件的大小,单位为字节。
  • tmp_name:文件被上传后在服务端储存的临时文件名,一般是系统默认,可以在php.ini的upload_tmp_dir指定。
  • error:文件上传相关的错误代码,具体含义如表1所示。

表1 文件上传错误代码

代码 常量 说明
0 UPLOAD_ERR_OK 没有错误发生,文件上传成功
1 UPLOAD_ERR_INI_SIZE 上传的文件超过了php.ini中upload_max_filesize 选项限制的值
2 UPLOAD_ERR_FORM_SIZE 上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值
3 UPLOAD_ERR_PARTIAL 只有部分文件被上传
4 UPLOAD_ERR_NO_FILE 没有文件被上传
6 UPLOAD_ERR_NO_TMP_DIR 找不到临时目录
7 UPLOAD_ERR_CANT_WRITE 文件写入失败

文件上传后,就会被服务器自动保存在临时文件中,文件的保存期限为PHP脚本的执行周期,当PHP脚本执行结束后,临时文件就会被释放。如果我们需要将文件永久保存下来,需要使用PHP提供的move_uploaded_file()函数将临时文件保存到指定的目标文件地址中。

   if(isset($_FILES['upload'])) {
     if($_FILES['upload']['error'] !== UPLOAD_ERR_OK){
       exit('上传失败!');
     }
     $save = './uploads/' . time() . '.dat';
     if(!move_uploaded_file($_FILES['upload']['tmp_name'], $save)) {
       exit('上传失败,无法将文件保存到指定位置!');
     }
     echo "上传成功!";
   }

上述代码在保存上传文件时,第5行代码利用时间戳自动生成文件名,而不是直接保存原文件名。这种方式可以防止客户端提交非法的文件名造成程序出错,也能防止客户端提交“.php”扩展名的文件,造成恶意脚本执行。第6行代码使用move_uploaded_file()函数将临时文件保存到指定的目录中。

点击此处
隐藏目录